如何强制子类对枚举进行常量引用?

时间:2015-10-15 15:38:19

标签: java enums

我有一个抽象类,我想强制它的子类引用一个Enum成员。这是我所拥有的简化版本:

public abstract class Action {

    public static enum ImpactType {
        Size(2), Position(2), Scale(1)

        final int elements;
        private ImpactType (int elements){
            this.elements = elements;
        }
    }

    protected abstract ImpactType impactType();
    protected abstract apply(float value, int element);

    public void apply(float value) {
        for (int i=0; i<impactType.elements; i++)
            apply(value, i);
    }
}

和一个示例实现:

public class PositionAction extends Action {

    Vector2 target;

    public PositionAction(Vector2 target){
        this.target= target;
    }

    protected ImpactType impactType(){ return ImpactType.Position; };

    protected abstract apply(float value, int element){
        switch (element){
        case 0:
            target.x = value;
            break;
        case 1:
            target.y = value;
            break;
        }
    }
}

问题在于,这并没有强制impactType方法每次都返回相同的内容。实际上,子类的两个不同实例可能会返回不同的ImpactType,但我需要确保每个子类都锁定到枚举的单个成员,因为我正在对这些对象执行其他操作。有关如何解决这个问题的想法吗?

2 个答案:

答案 0 :(得分:2)

您可以通过要求子类在构造上提供ImpactType来强制执行限制。

public abstract class Action {
    private final ImpactType m_impactType;

    Action( ImpactType impactType ) {
         m_impactType = impactType;
    }

    protected final ImpactType impactType() { 
        return m_impactType; 
    }
    ...
 }

然后您的子类可以通过super()提供影响类型:

public class PositionAction extends Action {
    private Vector2 target;

    public PositionAction(Vector2 target){
        super( ImpactType.Position );
        this.target= target;
    }
    ...
}

答案 1 :(得分:1)

不能覆盖最终方法。这允许您锁定实现,以便子类不能更改它。

protected final ImpactType impactType(){ return ImpactType.Position; };

或者,您可以像@javaguest建议的那样做,只需将ImpactType设置为带有公共getter的私有final字段。