每个枚举项的编号?

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)


Ita*_*man 5

(当然,选择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)