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

3

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

你会建议什么?

4个回答

9
静态字段无法被覆盖,因此这不是一个选项。最好的方法是给超类一个接受字符串参数的构造函数,这样子类就不会忘记“填写”值:
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"); }
}

好的,NPE 应该是 IllegalArgumentException,但是为什么在你的意见中受保护的构造函数是有问题的? - Sean Patrick Floyd
在JDK中,使用NPE来处理空参数是标准行为。其实,不要怪我,我只是在遵守规范。 - gustafc

7
子类应该指定值。超类应该定义它的接口。使用模板方法设计模式
例如:
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);
  }
}

谢谢!第一个选项就是我要找的。 - Jakub
@Jakub:如果您使用第一种选项,您应该知道从构造函数中不应调用您认为已被覆盖的方法(绝对方法肯定是如此),因为在运行超类构造函数时,定义方法的子类尚未初始化。 - gustafc

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

0
最佳实践是在抽象的超类/接口中定义一个抽象的get方法。 这样,每个子类可以实现自己的获取属性的方式。
abstract class SuperClass {
  abstract String getBlah();
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接