在应用程序框架中,我不断看到允许您将多个Int值(通常用于代替枚举)传递到函数中的框架.
例如:
public class Example { public class Values { public static final int ONE = 0x7f020000; public static final int TWO = 0x7f020001; public static final int THREE = 0x7f020002; public static final int FOUR = 0x7f020003; public static final int FIVE = 0x7f020004; } public static void main(String [] args) { // should evaluate just Values.ONE Example.multiValueExample(Values.ONE); // should evalueate just values Values.ONE, Values.THREE, Values.FIVE Example.multiValueExample(Values.ONE | Values.THREE | Values.FIVE); // should evalueate just values Values.TWO , Values.FIVE Example.multiValueExample(Values.TWO | Values.FIVE); } public static void multiValueExample(int values){ // Logic that properly evaluates bitwise values ... } }
那么multiValueExample中应该存在什么逻辑才能正确评估使用按位运算符传递的多个int值?
你的值应该是2的幂.
这样,当你按位OR时,你不会丢失任何信息.
public static final int ONE = 0x01; public static final int TWO = 0x02; public static final int THREE = 0x04; public static final int FOUR = 0x08; public static final int FIVE = 0x10;
等等
然后你可以这样做:
public static void main(String [] args) { Example.multiValueExample(Values.ONE | Values.THREE | Values.FIVE); } public static void multiValueExample(int values){ if ((values & Values.ONE) == Values.ONE) { } if ((values & Values.TWO) == Values.TWO) { } // etc. }
如前所述,请考虑使用枚举而不是位值.
根据Effective Java 2:"项目32:使用EnumSet而不是位字段"
使用EnumSet对于内存使用非常有效并且非常方便.
这是一个例子:
package enums; import java.util.EnumSet; import java.util.Set; public class Example { public enum Values { ONE, TWO, THREE, FOUR, FIVE } public static void main(String[] args) { // should evaluate just Values.ONE Example.multiValueExample(EnumSet.of(Values.ONE)); // should evalueate just values Values.ONE, Values.THREE, Values.FIVE Example.multiValueExample(EnumSet.of(Values.ONE, Values.THREE, Values.FIVE)); // should evalueate just values Values.TWO , Values.FIVE Example.multiValueExample(EnumSet.of(Values.TWO, Values.FIVE)); } public static void multiValueExample(Setvalues) { if (values.contains(Values.ONE)) { System.out.println("One"); } // Other checks here... if (values.contains(Values.FIVE)) { System.out.println("Five"); } } }
您将整数值设置为2的幂,以便每个枚举值是二进制表示中的单个位.
int ONE = 0x1; //0001 int TWO = 0x2; //0010 int THREE = 0x4; //0100 int FOUR = 0x8; //1000
然后使用逐位OR组合值和按位AND来测试设置值.
int test_value = (ONE | FOUR); //-> 1001 bool has_one = (test_value & ONE) != 0; //-> 1001 & 0001 -> 0001 -> true