如何为方法设置所需的常量?

How to set required constants for methods?

我正在创建一个名为 setState 的方法,我想为它使用二元运算符,但我想创建一些东西来检查传递的参数是否是 class:[=11= 中定义的常量]

public static final int STATE1 = 0b1;
public static final int STATE2 = 0b10;
public static final int STATE3 = 0b100;
public void setState(int stateType, boolean state){
    if(state){
        this.state |= stateType;
    }else{
        this.state &= ~stateType;
    }
 }

所以当我输入 setState(10, false) 时,它会说:参数类型错误,找到 x,需要 y

根据一组允许值检查值的一种方法是 Set<Integer> 包含所有允许值。您可以在 class 的静态构造函数中构造此类集合,即

private static final Set<Integer> allowedState = new HashSet<Integer>();
static {
    allowedState.add(STATE1);
    allowedState.add(STATE2);
    allowedState.add(STATE3);
}

现在您可以通过验证 allowedState 包含 stateType:

来检查传递给您的状态是否有效
if (!allowedState.contains(stateType)) {
    // Throw an exception
}

要确保 allowedState 集是不可变的,请使用 Collcetions.unmodifiableSet()。修饰符 final 仅确保不能将引用重新定义为另一个对象。

但是,基于原始 int 常量的方法 不是 惯用的 Java。实现相同效果的更好方法是将状态包装在 enum (tutorial) 中,这将确保只有一个有效常量可以传递给您的 setState 方法:

public enum State {
    STATE1(0b1)
,   STATE2(0b10)
,   STATE3(0b100);

    private final int bitMask;
    State(int bitMask) { this.bitMask = bitMask; }
    public int getBitMask() { return bitMask; }
}

您只希望 stateType 是 STATE1、STATE2 或 STATE3 之一? 您可以使用在 class 中定义的枚举。类似于:

public class MyClass{
    public enum State{
        STATE1 (0b1),
        STATE2(0b10),
        STATE3(0b100);

      public final int value;
      State(int value){
        this.value = value;
      }
    }

   public void setState(State stateType, boolean state){
    if(state){
        this.state |= stateType.value;
    }else{
        this.state &= ~stateType.value;
    }
  }
}