类字段在子类中具有不同值的最佳实践

时间:2010-06-08 09:47:57

标签: java

我有一些抽象类,在其中一个方法中我使用了一个字符串字段,该字段应该是特定于子类的。我想知道实现这个的实践是什么?通过字段并在子类的consructors中设置字段值?通过静态字段并更改每个子类中的值?

你会建议什么?

4 个答案:

答案 0 :(得分:8)

静态字段不可覆盖,因此不是一个选项。

最好的方法是为超类提供一个构造函数,该构造函数将字符串作为参数,因此子类不会忘记“填写”该值:

abstract class Super {
    final String blah;
    protected Super(String blah) {
        if (blah == null) throw new NullPointerException();
        this.blah = blah;
    }
    public String getBlah(){ return blah; }
}
class Sub extends Super {
    public Sub() { super("Sub"); }
}

答案 1 :(得分:7)

子类应指定值。超类应该定义它的接口。使用template method design pattern

示例:

public abstract class SuperClass {
  public abstract String getSomeValue();

  public void method() {
     String s = getSomeValue();
  }
}


public class SubClass extends SuperClass {
  private static final String CONSTANT = "";

  public String getSomeValue() {
    return CONSTANT;
  }
}

另一种选择是在构造函数中设置它:

public abstract class SuperClass {
  private String value;

  public SuperClass(String value) {
    this.value = value;
  }
}


public class SubClass extends SuperClass {
  private static final String CONSTANT = "";

  public SubClass() {
    super(CONSTANT);
  }
}

答案 2 :(得分:1)

abstract class Base{
        String field ;
        public Base(String field){
            this.field = field;
        }
    }
class Sub extends Base{
    public Sub(String field){
        super(field);
    }
}

答案 3 :(得分:0)

最佳做法是在抽象超类/接口上定义一个抽象的get方法。

这样每个子类都可以实现自己获取属性的方式。

abstract class SuperClass {
  abstract String getBlah();
}

class SubClass extends SuperClass{
  String getBlah(){
    return "blubb";
  }
}