2017-02-21 5 views
0

2つのエンティティクラスが少し異なりますが、ほとんど同じように と2つのエンティティクラスを使用しています。 StudentDataおよびPassDataは両方ともgetDatatype()およびgetPassIndLinkId()のようなメソッドを持っています。2ビットの異なるオブジェクト用のJava関数

私は同様のコードを2回書くのを避けるために何ができますか?

private StudentData getStudentDataEqual(PassIndLinkReq passIndLinkReq, List<StudentData> dataList, Long val){   
    for (StudentData data:dataList) { 
     if (data.getPassIndLinkId().intValue()==passIndLinkReq.getId().intValue()){ 
      switch (passIndLinkReq.getDatatype().intValue()) { 
       case 0: 
       case 1: 
       return data; 
       case 7: 
       if (data.getClassItemTreeId().equals(val)){ 
        return data; 
       } 
       break; 
       ... 
      } 
     }   
    }       
    return new StudentData(); 
} 
// and this 
private PassData getStudentDataEqual(PassIndLinkReq passIndLinkReq, List<PassData> dataList, Long val){   
    for (PassData data:dataList){ 
     if (data.getPassIndLinkId().intValue()==passIndLinkReq.getId().intValue()) { 
      switch (passIndLinkReq.getDatatype().intValue()) { 
      case 0: 
      case 1: 
       return data; 
      case 7: 
       if (data.getClassItemTreeId().equals(val)){ 
        return data; 
       } 
       break; 
      ... 
      } 
     }   
    }       
    return new PassData(); 
} 
+0

StudentDataとPassDataは関連していますか? 1つは別のクラスのサブクラスですか? –

+3

インターフェイスの使用についての考えですか? –

+0

インターフェイスを使用してコードを2回書くのを防ぎませんが、同じ効果を達成するさまざまな方法がある場合にインターフェイスが使用されます。コードが共有されている場合は、共通の親クラスを使用します。 – fustaki

答えて

0

(新しいインスタンスを返しているので、代わりにインターフェイスの)あなたは新しいスーパークラスを使用することができました両方のクラスが継承します:

public class Data { ... } 

public class StudentData extends Data { ... } 

public class PassData extends Data { ... } 

これは、最もクリーンなバリアントではありませんが、うまくいくはずです。

private Data getStudentDataEqual(PassIndLinkReq passIndLinkReq, List<Data> dataList, Long val){   
    for (T data:dataList){ 
     if (data.getPassIndLinkId().intValue()==passIndLinkReq.getId().intValue()) { 
      switch (passIndLinkReq.getDatatype().intValue()) { 
       case 0: 
       case 1: 
        return data; 
       case 7: 
        if (data.getClassItemTreeId().equals(val)){ 
         return data; 
        } 
        break; 
       ... 
       } 
      }   
     }       
    return new Data(); 
} 

しかし、この解決策では、後で戻り値をキャストする必要があります。

1

あなたが試みることができる2つあります:StudentDataとPassDataが無関係であれば、あなたは彼らが継承し、このクラスでは、あなたの機能のために必要なメソッドを実装することができ、両方のスーパークラスを作成することができます。 (関連している場合は、おそらくスーパークラスを使用して関数を使用できます)。

また、関数に必要なメソッドを持つインターフェイスを作成し、このインターフェイスをStudentDataクラスとPassDataクラスの両方で実装することもできます。

0

StudentDataとPassDataは、適切なgetPassIndLinkId()メソッドとgetClassItemTreeId()メソッド(実際にはすべての一般的なメソッド)を持つ、より一般的な抽象クラス 'GeneralData'などのサブクラスでなければなりません。

次に、このGeneralDataクラスを利用する単一のメソッドを使用できます。

0

getStudentDataEqual()はリストから何らかのデータを取得しているようですので、既に他の回答で指定されているものの3番目のオプションとして、それらのインスタンスを格納および取得できるジェネリックコンテナクラスを作成できます2つの可能性のある他のクラスもあります。

この場合、getStudentDataEqual()はコンテナを使用して検索を行うため、これらのメソッドは両方のクラスで非常に短いものになります。

2

既に言及したように、StudentDataPassDataが共通のインタフェースを実装しているのか共通の基本クラスを持っているのかを知るのに役立ちます。二つのオブジェクトについて何も知らず

、あなたはまだ、次のような何かを行うことができます。

private <T> T getStudentDataEqual(PassIndLinkReq passIndLinkReq, List<T> dataList, Long val, 
            ToIntFunction<? super T> passIndLinkIdAccessor, 
            Function<? super T, ?> classItemTreeIdAccessor, 
            Supplier<? extends T> factory) { 
    for (T data:dataList) { 
     if (passIndLinkIdAccessor.applyAsInt(data)==passIndLinkReq.getId().intValue()){ 
      switch (passIndLinkReq.getDatatype().intValue()) { 
       case 0: 
       case 1: 
        return data; 
       case 7: 
        if (classItemTreeIdAccessor.apply(data).equals(val)){ 
         return data; 
        } 
        break; 
       //... 
      } 
     } 
    } 
    return factory.get(); 
} 


private StudentData getStudentDataEqual(PassIndLinkReq passIndLinkReq, List<StudentData> dataList, Long val){ 
    return getStudentDataEqual(passIndLinkReq, dataList, val, 
      data -> data.getPassIndLinkId().intValue(), 
      data -> data.getClassItemTreeId(), StudentData::new); 
} 
private PassData getPassDataEqual(PassIndLinkReq passIndLinkReq, List<PassData> dataList, Long val) { 
    return getStudentDataEqual(passIndLinkReq, dataList, val, 
      data -> data.getPassIndLinkId().intValue(), 
      data -> data.getClassItemTreeId(), PassData::new); 
} 
+0

これはJava 8ですか? –

+0

はい、ラムダ式を使用しているため、Java 8以上 – marco

関連する問題