2017-12-13 28 views
0

Response classにはn個のフィールドが含まれていて、Response classを拡張する複数のクラスがあります。すべてのメソッドで、私はサブクラスのフィールドと一緒に応答クラスのフィールドを設定する代わりに、私は親クラスのすべてのフィールドを設定し、私にサブクラスを返す共通のメソッドを作成したい。親クラスのフィールドの値を設定する一般的な方法

親クラス

class Response{ 
    private String a; 
    public String getA() { 
     return a; 
    } 

    public void setA(String a) { 
     this.a = a; 
    } 
} 

サブクラス1

class Custom extends Response{ 

private String b; 

    public String getB() { 
     return b; 
    } 

    public void setB(String b) { 
     this.b = b; 
    } 

} 

サブクラス2

class Custom1 extends Response{ 

    private String c; 

     public String getC() { 
      return c; 
     } 

     public void setC(String c) { 
      this.c = c; 
     } 

    } 

方法1

public Custom setFields(String aValue,String bValue){ 
    Custom c = new Custom(); 
    c.setA(aValue); 
    c.setB(bValue); 
    return c; 
} 

方法2

public Custom1 setFields(String aValue,String cValue){ 
    Custom1 c1 = new Custom1(); 
    c1.setA(aValue); 
    c1.setC(cValue); 
return c1; 
} 

私はレスポンスクラスに属するフィールドの値を設定する方法を作成して、私に同じクラスのオブジェクトのカスタムやカスタム1を返すようにしたいですそれぞれ

例:

Custom c = setResponseValue(aValue); OR 
Custom1 c1 = setResponseValue(aValue); 

方法

public Custom/Custom1 setResponseValue(String value){ 
/** 

Sets the value 

**/ 

return Custom/Custom1; 
} 

のようなもの、私はフィールドのない応答クラスの増加としてオーバーとagain.Problemの増加を介して同じことを行いませんする必要があるよう助けてください。

答えて

0

あなたが、あなたはどのように特定のサブクラスを作成することを指示する必要があり、あなたのPOJOクラスの外にsetResponseValueをしたい場合。ここでは、Javaのラムダとジェネリックでそれを達成することができる方法である。

Custom c1 = setResponseValue(Custom::new, "a1");   
Custom1 c2 = setResponseValue( Custom1::new, "a1"); 

public static <T extends Response> T setResponseValue(Supplier<T> s, String value){ 
    T result = s.get(); 
    result.setA(value); 
    return result; 
} 
3

親クラスの値を持つ子クラスを戻したいので、入力値を持つ子クラスのコンストラクターを持ち、それを使用して親クラスの値を設定できます。

public class Response { 
    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

public class Child extends Response { 

    public Child(String value) { 
     setValue(value); 
    } 
} 

そして、このようにそれを使用します。

Child childResponse = new Child("hey"); 

アップデート: 私はあなたが意味を正確に理解していないけど、あなたはコンストラクタで値を設定しない場合、および既存の子オブジェクトの値を設定したくない場合は、この新しい値で返されたクローンオブジェクトが必要になることがあります。あなたのクラスがCloneableインタフェースをサポートしていることを確認してください:

public Child cloneAndSetValue(String value) throws CloneNotSupportedException { 
    Child c = (Child) this.clone(); 
    c.setValue(value); 
    return c; 
} 
+0

しかし、問題は、私は開始時にクラスを初期化する必要があり、すべての処理が行われ、値がそれに応じて変更される可能性の後、私は最後の値を取得その値が一時変数に割り当てられ、最後に親クラスの値に割り当てられます。 –

+0

あなたは何を意味するのか分かりません。あなたは精緻化したり、言い換えてくださいできますか? – mart

+0

私はちょうど私のコメントを編集しました –

関連する問題