Java:在使用整数常量声明枚举时遇到问题

时间:2010-08-26 00:31:56

标签: java enums

Urgh,我对于enums如何在Java中工作感到困惑。在C#和C ++(我通常使用的)中,这似乎没问题,但Java想对我生气>。>

   enum Direction
   {
      NORTH_WEST = 0x0C,
      NORTH      = 0x10,
      NORTH_EAST = 0x14,
      WEST       = 0x18,
      NONE       = 0x20,
      EAST       = 0x28,
      SOUTH_WEST = 0x24,
      SOUTH      = 0x30,
      SOUTH_EAST = 0x3C
   }

有人能告诉我我做错了什么吗? 感谢

以下是错误:

 ----jGRASP exec: javac -g Test.java

Test.java:79: ',', '}', or ';' expected
      NORTH_WEST = 0x0C,
                 ^
Test.java:79: '}' expected
      NORTH_WEST = 0x0C,
                  ^
Test.java:80: <identifier> expected
      NORTH      = 0x10,
           ^
Test.java:87: ';' expected
      SOUTH_EAST = 0x3C
                       ^

4 个答案:

答案 0 :(得分:22)

对于这种情况,看起来您只需使用实例字段

public enum Direction {
   NORTH(0x10), WEST(0x18), ...;

   private final int code;
   Direction(int code)  { this.code = code; }
   public int getCode() { return code; }
}

Java enum被实现为对象。他们可以有领域和方法。您还可以选择声明一个带有一些参数的构造函数,并在常量声明中为这些参数提供值。您可以使用这些值初始化任何声明的字段。

另见


附录:EnumSetEnumMap

请注意,根据这些值的不同,您可能拥有比实例字段更好的选项。也就是说,如果您尝试为位字段设置值,则应该使用EnumSet代替。

通常看到C ++中的两个常量的幂与bitwise operations一起用作集合的紧凑表示。

// "before" implementation, with bitwise operations

public static final int BUTTON_A = 0x01;
public static final int BUTTON_B = 0x02;
public static final int BUTTON_X = 0x04;
public static final int BUTTON_Y = 0x08;

int buttonState = BUTTON_A | BUTTON_X; // A & X are pressed!

if ((buttonState & BUTTON_B) != 0) ...   // B is pressed...

使用enumEnumSet,可以看起来像这样:

// "after" implementation, with enum and EnumSet

enum Button { A, B, X, Y; }

Set<Button> buttonState = EnumSet.of(Button.A, Button.X); // A & X are pressed!

if (buttonState.contains(Button.B)) ... // B is pressed...

您可能还想使用EnumMap。它是Map,其键为enum常量。

所以,和以前一样,你可能会有这样的事情:

// "before", with int constants and array indexing

public static final int JANUARY = 0; ...

Employee[] employeeOfTheMonth = ...

employeeOfTheMonth[JANUARY] = jamesBond;

现在你可以:

// "after", with enum and EnumMap

enum Month { JANUARY, ... }

Map<Month, Employee> employeeOfTheMonth = ...

employeeOfTheMonth.put(Month.JANUARY, jamesBond);

在Java中,enum是一个非常强大的抽象,它也适用于Java Collections Framework。

另见

相关问题

答案 1 :(得分:12)

在Java枚举中,默认情况下不保留任何其他值。您必须创建一个私有字段来存储一个。试试这样的事情

enum Direction {
   NORTH_WEST(0x0C),
   NORTH(0x10),
   ...

   private final int code;
   private Direction(int code) {
       this.code = code;
   }
}

必要时添加getter。

答案 2 :(得分:0)

如果您有Java 8,并且曾经有自己的工具箱。 然后,您可以添加以下工具:

  • Java 8样式接口

    public interface IntEnumInterface
    {
        // Will MAP all your application Enums (of type integer)
        final static Map<String, IntEnumInterfaceHelper> enumHelpers = new HashMap<String, IntEnumInterfaceHelper>();
        // Ensure Enum unique name accross your application
        default String getEnumUniqueName() { return this.getClass().getCanonicalName() + ":" + this.toString(); }
    
        default void init(int value)
        {
            IntEnumInterfaceHelper h = new IntEnumInterfaceHelper(){};
            h.init(value);
            enumHelpers.put(getEnumUniqueName(), h);
        }
    
        // Access the linked helper to retrieve integer value
        default public int getId() { return enumHelpers.get(getEnumUniqueName()).getValue(); }
    
        // helper (pseudo abstract)
        abstract class IntEnumInterfaceHelper
        {
            private int intValue;
            public void init(int value) { intValue = value; }
            public int getValue() { return intValue; }
        };
    }
    
  • 从现在开始,您可以使用以下方式定义枚举:

    public enum RecordStatus implements IntEnumInterface
    {
        NEW(1), PROCESSING(2) ,PROCESS_COMPLETE(3), TO_DELETE(0);
        RecordStatus(int id) { init(id); }
    }
    
  • 然后使用以下方法获取枚举数值:

    System.out.println(RecordStatus.NEW.getId());
    System.out.println(RecordStatus.PROCESSING.getId());
    System.out.println(RecordStatus.PROCESS_COMPLETE.getId());
    System.out.println(RecordStatus.TO_DELETE.getId());
    

答案 3 :(得分:0)

只需要没有特定值的连续数字时的快速方法:

use HasFactory;
        protected $table = 'cats';
         protected $fillable = ['name','slug'];
    
    
         public function post(){
            return $this->hasMany('App\post');
         }

使用

enum PAGE {WATER, FIRE}
static final PAGE[] intToPage = PAGE.values();