Java: Having trouble declaring an enum with integer constants

后端 未结 3 2079
庸人自扰
庸人自扰 2021-01-19 17:19

Urgh, I\'m kind of confused on how enums work in Java. In C# and C++ (what I use normally), this seems okay, but Java wants to get mad at me >.>

   enum Dire         


        
3条回答
  •  情书的邮戳
    2021-01-19 17:39

    For this scenario, it looks like you can simply use an instance field.

    public enum Direction {
       NORTH(0x10), WEST(0x18), ...;
    
       private final int code;
       Direction(int code)  { this.code = code; }
       public int getCode() { return code; }
    }
    

    Java enum are implemented as objects. They can have fields and methods. You also have the option of declaring a constructor that takes some arguments, and providing values for those arguments in your constant declaration. You can use these values to initialize any declared fields.

    See also

    • Java Language Guide/Enums - a quick but comprehensive guide to Java enum

    Appendix: EnumSet and EnumMap

    Note that depending on what these values are, you may have an even better option than instance fields. That is, if you're trying to set up values for bit fields, you should just use an EnumSet instead.

    It is common to see powers of two constants in, say, C++, to be used in conjunction with bitwise operations as a compact representation of a set.

    // "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...
    

    With enum and EnumSet, this can look something like this:

    // "after" implementation, with enum and EnumSet
    
    enum Button { A, B, X, Y; }
    
    Set

    There is also EnumMap that you may want to use. It's a Map whose keys are enum constants.

    So, where as before you may have something like this:

    // "before", with int constants and array indexing
    
    public static final int JANUARY = 0; ...
    
    Employee[] employeeOfTheMonth = ...
    
    employeeOfTheMonth[JANUARY] = jamesBond;
    

    Now you can have:

    // "after", with enum and EnumMap
    
    enum Month { JANUARY, ... }
    
    Map employeeOfTheMonth = ...
    
    employeeOfTheMonth.put(Month.JANUARY, jamesBond);
    

    In Java, enum is a very powerful abstraction which also works well with the Java Collections Framework.

    See also

    • Java Tutorials/Collections Framework
    • Effective Java 2nd Edition
      • Item 30: Use enum instead of int constants
      • Item 31: Use instance fields instead of ordinals
      • Item 32: Use EnumSet instead of bit fields
      • Item 33: Use EnumMap instead of ordinal indexing

    Related questions

    • Enumerations: why? when? - with examples of EnumSet and EnumMap usage

提交回复
热议问题