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

时间:2015-12-26 19:38:16

标签: java methods types arguments required

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

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

2 个答案:

答案 0 :(得分:1)

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

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来说不是惯用语。实现相同效果的更好方法是将状态包装在enumtutorial)中,这样可以确保只有有效常量可以传递给setState方法:< / p>

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

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

答案 1 :(得分:1)

你只希望stateType是STATE1,STATE2或STATE3之一吗? 您可以使用该类中定义的枚举。类似的东西:

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;
    }
  }
}