如何为方法设置所需的常量?
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;
}
}
}
我正在创建一个名为 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;
}
}
}