为父类设置字段值的常用方法

时间:2017-12-13 16:07:25

标签: java

我有一个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;
    }

}

Sub Class2

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;
}

我想创建一个方法来设置属于Response类的字段的值,并分别返回相同的类对象Custom或Custom1

前:

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

类似

的方法
public Custom/Custom1 setResponseValue(String value){
/**

Sets the value

**/

 return Custom/Custom1;
}

请帮助,因为我需要一遍又一遍地做同样的事情。问题随着响应类中字段数的增加而增加。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

如果您希望setResponseValue超出您的pojo类,那么您需要告诉它如何创建特定的子类。以下是使用Java lambdas和泛型完成它的方法:

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;
}