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

Java 如何设置方法所需的常量?,java,methods,types,arguments,required,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){

我正在创建一个名为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

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

private static final Set<Integer> allowedState = new HashSet<Integer>();
static {
    allowedState.add(STATE1);
    allowedState.add(STATE2);
    allowedState.add(STATE3);
}
要确保allowedState集是不可变的,请使用
collections.unmodifiableSet()
。修改器
final
仅确保引用不能重新绑定到另一个对象

然而,基于原始
int
常量的方法并不适合Java。实现相同效果的更好方法是将状态包装在
enum
()中,这将确保只能将有效常量传递给
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中的一个? 可以使用该类中定义的枚举。比如:

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

这个.state的类型是什么?它是整数,类变量:private int state;或者更好的方法是使用
enum
@mickmnomonic。这是我回答的第二部分-我正在打字。非常有用的信息,我是Java新手,在这里,我会看看这是我要找的
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;
    }
  }
}