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
^
答案 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
被实现为对象。他们可以有领域和方法。您还可以选择声明一个带有一些参数的构造函数,并在常量声明中为这些参数提供值。您可以使用这些值初始化任何声明的字段。
enum
EnumSet
和EnumMap
请注意,根据这些值的不同,您可能拥有比实例字段更好的选项。也就是说,如果您尝试为位字段设置值,则应该使用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...
使用enum
和EnumSet
,可以看起来像这样:
// "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。
EnumSet
和EnumMap
用法答案 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();