Java: There was a problem declaring an enumeration with integer constants

Phew, I'm a little confused about how enums work in Java. In C # and C ++ (which I usually use) this seems fine, but Java wants to get mad at me>. >

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

Can someone tell me what I am doing wrong? Thanks

Here are the errors:

  ----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
java enums
Aug 26 '10 at 0:31
source share
2 answers

For this scenario, it looks like you can just use the 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 implemented as objects. They can have fields and methods. You also have the option of declaring a constructor that takes some arguments and provides values ​​for these arguments in your constant declaration. These values ​​can be used to initialize all declared fields.

see also




Application: EnumSet and EnumMap

Note that depending on what these values ​​are, you may have an even better option than the instance fields. That is, if you are trying to adjust the values ​​for bit fields, you should just use EnumSet .

It is generally accepted to consider the powers of two constants, for example, in C ++, which will be used in conjunction with bitwise operations in the form of 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 might look something like this:

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

There is also an EnumMap that you can use. This is a Map whose keys are enum constants.

So where, as before, there might be something like this:

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

Now you can:

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

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

see also

  • Tutorials / Java Collections
  • Effective Java 2nd Edition
    • Point 30: use enum instead of int constants
    • Item 31: Use instance fields instead of ordinals
    • Item 32: Use EnumSet Instead of Bit Fields
    • Paragraph 33: Use EnumMap instead of Indexing

Related Questions

  • Enumerations: why? when? - with examples of using EnumSet and EnumMap
+21
Aug 26 '10 at 0:35
source share

Java enumerations do not store any other values ​​by default. You will need to create a private field to store it. Try something like this

 enum Direction { NORTH_WEST(0x0C), NORTH(0x10), ... private final int code; private Direction(int code) { this.code = code; } } 

Add a getter if necessary.

+12
Aug 26 '10 at 0:35
source share



All Articles