Jal*_*lal 7 java enums integer bit-manipulation
是否有可能在java中定义这样的东西?
C#代码:
public enum Character
{
A = 1,
B = 2,
C = 4,
D = 8
}
...
Character ch = /* from user */
if(ch & Character.A)
{
// some operation...
}
Run Code Online (Sandbox Code Playgroud)
例如,如果ch设定为Character.B随后的结果if将是false:
ch = 00000000 00000000 00000000 00000010
A = 00000000 00000000 00000000 00000001
------------------------------------------
& 00000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
我想实现类似的东西!在Java中有可能吗?
Jon*_*eet 25
好吧,你几乎可以这样做:
public enum CharEnum // Let's avoid java.lang.* clashes
{
A(1), B(2), C(4), D(8);
private final int mask;
private CharEnum(int mask)
{
this.mask = mask;
}
public int getMask()
{
return mask;
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
CharEnum ch = /* from user */
if ((ch.getMask() & CharEnum.A.getMask()) > 0)
{
// some operation...
}
Run Code Online (Sandbox Code Playgroud)
这在某些情况下很有用,但正如迈克尔所说,你一定要注意EnumSet一般的"价值观"选项.
如果你决定去与值的枚举,你可以把枚举本身额外的逻辑:
public enum CharEnum
{
// Other code as before
public boolean overlapsWith(CharEnum ch)
{
return (ch.mask & mask) > 0;
}
}
Run Code Online (Sandbox Code Playgroud)
(当然,选择Character作为枚举的名称是非常混乱的,因为它会产生冲突,java.lang.Character并自动导入每个编译单元)
您可以使用ordinal()方法获取与枚举常量关联的整数.无论如何,我觉得你想要实现的目标可以通过枚举定义的方法来实现.我的意思是,Java的枚举比C/C++更强大,因为你可以将行为与它们联系起来.
public enum Chr {
A {
@Override public void doSomething(int c) {
// some operation ...
}
},
B,
C,
D;
public void doSomething(int c) {
// some default behavior
}
}
Run Code Online (Sandbox Code Playgroud)
发表评论后:
您可以定义一个将保存此值的字段,并让构造函数初始化它,如下所示:
public enum Chr {
A(1),
B(2),
C(4),
D(8)
;
public Chr(int n) { value = n; }
public final int value;
}
Character ch = ... // from user
if(ch & Chr.A.value) {
...
}
Run Code Online (Sandbox Code Playgroud)