Java 如何初始化子类中的静态成员?

Java 如何初始化子类中的静态成员?,java,Java,假设我们有一个抽象类,它定义了一个取整数的构造函数,其中先决条件检查整数是否在可能值列表中: public abstract class Value { protected int value; protected static List<Integer> possibleValues; public Value(int val) { if (!possibleValues.contains(val)) throw new Il

假设我们有一个抽象类,它定义了一个取整数的构造函数,其中先决条件检查整数是否在可能值列表中:

public abstract class Value {
   protected int value;
   protected static List<Integer> possibleValues;

   public Value(int val) {
       if (!possibleValues.contains(val))
           throw new IllegalArgumentException("Illegal value");
       value = val;
   }
}
公共抽象类值{
保护整数值;
受保护的静态列表可能值;
公共价值(int val){
如果(!possibleValues.contains(val))
抛出新的IllegalArgumentException(“非法值”);
值=val;
}
}
但是我们想在
Value
的子类中初始化该列表,因为每个子类都定义自己的可能值列表

我想我可以做一个
静态
块,将成员添加到
可能值
,尽管我不喜欢
静态
块。但这并不意味着所有子类都会停止指向同一个可能值列表

如何强制子类定义可能值的列表并执行前提条件检查,而不必面对我描述的问题

编辑:所以我们可以说我想继承行为而不是变量本身。

怎么样:

public abstract class Value {
   protected int value;
   protected abstract List<Integer> getPossibleValues();

   public Value(int val) {
       if (!getPossibleValues().contains(val))
           throw new IllegalArgumentException("Illegal value");
       value = val;
   }
}
公共抽象类值{
保护整数值;
受保护的抽象列表getPossibleValues();
公共价值(int val){
如果(!getPossibleValues().包含(val))
抛出新的IllegalArgumentException(“非法值”);
值=val;
}
}

您的子类将被迫实现
getPossibleValues()

这样的功能怎么样:

public abstract class Value {
    int value;

    protected Value(int val, List<Integer> possibleValues) {
        if (!possibleValues.contains(val)) {
            throw IllegalArgumentException();
        }
        this.value = val;
    }
}

class SubValue extends Value {
    private static final List<Integer> possibleValues = ...;
    SubValue(int val) {
        super(val, possibleValues);
    }
}
公共抽象类值{
int值;
保护值(int-val,列出可能的值){
如果(!possibleValues.contains(val)){
抛出IllegalArgumentException();
}
this.value=val;
}
}
类子值扩展值{
私有静态最终列表可能值=。。。;
子值(int-val){
超级(val,可能值);
}
}

为什么不定义子类填写的抽象
isValid
方法?或者使用派生类提供的ValueChecker类将值模板化?我建议使用集合而不是列表。此外,使用工厂模式会更有用、更干净。总体思路不错,但这里有一个构造函数调用子类重写方法,这是一个坏主意:@dabadaba:这只是我头脑中的想法。正如Oliver指出的那样,它不是最好的主意,而且肯定可以找到更好的设计。@Oliver到目前为止,它可以做到,因为父类不会被继承。我完全可以控制这一切。但出于好奇,你会建议什么替代方案?@dabadaba在我编辑的答案中看到了第一个解决方案。基本上,基类构造函数有一个必需的参数,即合法整数列表。子类必须通过这样一个列表,这样他们就不会忘记,它可以来自每个子类中的一个静态,我想,这就是你所追求的。@Oliver,你不同意吗?如果像我之前描述的那样,这个特殊情况,除了我已经定义的子类之外,不会有其他子类吗?为什么他们会记得这样做?“我设计的全部要点是在父类中包含行为(先决条件检查),这样子类就不必这样做了。”dabadaba同意。刚刚用我认为更好的选项更新了答案。