我正在创建一个名为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
答案 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来说不是惯用语。实现相同效果的更好方法是将状态包装在enum
(tutorial)中,这样可以确保只有有效常量可以传递给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;
}
}
}