Tag: 枚举

Java将枚举编译成什么?

我和同事讨论了Java如何代表枚举。 我的印象是他们像C / C ++一样严格要求。 或者,如果添加行为(Type-Safe枚举),它将被包装在一个类中。 他认为,如果它足够小,Java会将其压缩到一个字节。 但是,我在Oracle网站上发现了这个: Java编程语言枚举远比其他语言中的对应程序更强大,这些语言只不过是美化整数。 新的枚举声明定义了一个完整的类(称为枚举类型)。 我认为它们是实际的物体。 如果是这样,有没有办法优化它们以节省空间? 谢谢 编辑:正如Jon对答案的评论中提到的,我是在Enum的序列化大小之后。

“if”声明与OO设计

我有枚举说ErrorCodes public enum ErrorCodes { INVALID_LOGIN(100), INVALID_PASSWORD(101), SESSION_EXPIRED(102) …; private int errorCode; private ErrorCodes(int error){ this.errorCode = error; } //setter and getter and other codes } 现在我用这个错误代码检查我的exception错误代码。 如果这样做,我不想写,如果这样做的话。 我怎么能解决这个问题(如果块写10+) 这种情况有什么设计模式吗? 谢谢

带接口的枚举类成员无法在内部找到方法

我有一个奇怪的问题,我不确定它是编译器问题还是我对带接口的枚举的理解。 我正在使用IntelliJ IDEA 12,构建一个Android项目,我有一个这样的类: public class ClassWithEnum { private MyEnum myEnum; //Trying to access it internally here throws the error public boolean isActionable() { return myEnum.isActionable(); } public enum MyEnum implements Action { ACTIONABLE() { @Override public boolean isActionable() { return true; } }, NOT_ACTIONABLE() { @Override public boolean isActionable() { return false; } } […]

是否可以使用方法创建一个空的Java枚举类型?

我可以创建一个空的Java枚举类型,但是当我想添加一些方法时:我得到一个“语法错误”(进入Eclipse)。 我没有找到关于此的官方文档,所以我的问题是:它是不可能的(所以它在哪里明确提到?)或者只是编译器错了?

如何在Java中比较字符串与枚举类型?

我有一份美国所有州的枚举列表如下: public enum State { AL, AK, AZ, AR, …, WY } 在我的测试文件中,我将从包含状态的文本文件中读取输入。 由于它们是字符串,我如何将它与枚举列表的值进行比较,以便为我设置的变量赋值: private State state; 我知道我需要通过枚举列表。 但是,由于值不是字符串类型,您如何比较它? 这就是我盲目打字的原因。 我不知道它是否正确。 public void setState(String s) { for (State st : State.values()) { if (s == State.values().toString()) { s = State.valueOf(); break; } } }

为什么Java枚举常量初始化不完整?

我偶然发现了一个非常奇怪的错误,我无法解释它为什么会发生。 想象一下以下枚举: import java.awt.Color; public class test { /** * @param args */ public static void main(String[] args) { System.out.println(MyEnum.CONSTANT1.get()); System.out.println(MyEnum.CONSTANT2.get()); } private enum MyEnum { CONSTANT1(staticMethod1()), CONSTANT2(staticMethod2()); private static final Color WHY_AM_I_NULL = new Color(255, 255, 255); private final Color color; private MyEnum(Color color) { this.color = color; } public Color get() { return […]

迭代EnumMap#entrySet

枚举Map#entrySet对于所有Map实现都没有预期的效果,特别是对于EnumMap, IdentityHashMap ,这里是来自Josh Bloch的益智游戏(Puzzle 5)的示例代码 – public class Size { private enum Sex { MALE, FEMALE } public static void main(String[] args) { printSize(new HashMap()); printSize(new EnumMap(Sex.class)); } private static void printSize(Map map) { map.put(Sex.MALE, Sex.FEMALE); map.put(Sex.FEMALE, Sex.MALE); map.put(Sex.MALE, Sex.MALE); map.put(Sex.FEMALE, Sex.FEMALE); Set<Map.Entry> set = new HashSet<Map.Entry>(map.entrySet()); System.out.println(set.size()); } } 是的,这会产生错误的结果 – 应该是 2 2 […]

使用enum.values()与String数组时是否有性能损失?

我正在使用枚举来替换我的Java应用程序中的String常量(JRE 1.5)。 当我将enum视为不断调用的方法中的静态名称数组(例如,在呈现UI时)时,是否会有性能损失? 我的代码看起来有点像这样: public String getValue(int col) { return ColumnValues.values()[col].toString(); } 澄清: 我关心的是与重复枚举values()相关的隐藏成本(例如在paint()方法中)。 我现在可以看到我的所有场景都包含一些int => enum转换 – 这不是Java的方式。 提取values()数组的实际价格是多少? 这甚至是个问题吗? Android开发者 请阅读下面的Simon Langhoff的答案,Geeks On Hugs在接受的答案评论中已经指出了这一点。 Enum.values() 必须做一个防御性的副本

如何在java中的方法中将枚举作为参数传递?

public class Enumvalues{ enum courseList { JAVA, C, PYTHON, PERL } enum generalInformation { NAME, AGE, PHONE } enum sex { MALE, FEMALE } } public static void main(String args[]) { printEnumValue(generalInformation); // how to pass enum in this block } static void printEnumValue(enum generalInformation) { // how to receive enum in this block System.out.println(java.util.Arrays.asList(generalInformation.values())); […]

为什么枚举构造函数无法访问静态字段

可能重复: 为什么enum的构造函数不能访问静态字段? enum Test { e1,e2; int i=0; static int j=5; Test(){ System.out.println(i+” “+j); } } 在上面的代码中,构造函数可以访问实例变量但不能访问静态变量J. 我已经阅读了与其他作者有关的答案,所有人都说在初始化J(静态字段)之前初始化了e1和e2,但是根据java规范所有的静态字段在类加载到内存时初始化,也就是在运行之前构造函数。 因此,在运行Test()构造函数之前,必须初始化静态变量j。 我无法理解限制,任何机构都可以让我理解。我已经阅读了问题的答案为什么enum的构造函数不能访问静态字段? 但我对以下答案感到不满: – 在静态字段全部初始化之前调用构造函数。 假设如果使用像枚举这样的简单类的另一个例子 class Test{ public static final Test t=new Test(); static int a=5; Test(){ System.out.println(a); } public static void main(String[] args) { } } 根据那里的参数,构造函数将在静态字段初始化之前运行,并且它也在运行时打印0(因为JVM执行了初始化)。 但没有编译错误或没有运行时问题。 那么为什么同样的事情不会发生在枚举上。