带有静态计数器的Java-enum 我想在java中实现C++类的枚举,所以我想使用静态字段作为计数器。这是我当前的解决方案: public enum ETest { Test1(2), Test2, Test3, Test4(7), Test5; private static class CounterHolder { private static int mCount = 0; } ETest() { mValue = CounterHolder.mCount; CounterHolder.mCount++; } ETest(int pValue) { CounterHolder.mCount = pValue; mValue = CounterHolder.mCount; CounterHolder.mCount++; } public int toInt() { return mValue; } private final int mValue; }
从上面的代码中,我应该得到: Test1.toInt()->2,Test2.toInt()->3,Test3.toInt()->4,Test4.toInt()->7,Test5.toInt()->8 这段代码在经过测试的Android Java虚拟机上运行良好,但是我不确定它是否是有效的Java代码,以及它是否能在所有有效的Java虚拟机上正常工作,因为AFAIK enum在静态字段之前初始化,但在这种情况下,带静态字段的嵌套类的按需初始化似乎运行良好(如果没有嵌套类,简单的静态字段不起作用) 致以最良好的祝愿,带有静态计数器的Java-enum 我想在java中实现C++类的枚举,所以我想使用静态字段作为计数器。这是我当前的解决方案: public enum ETest { Test1(2), Test2, Test3, Test4(7), Test5; private static class CounterHolder { private static int mCount = 0; } ETest() { mValue = CounterHolder.mCount; CounterHolder.mCount++; } ETest(int pValue) { CounterHolder.mCount = pValue; mValue = CounterHolder.mCount; CounterHolder.mCount++; } public int toInt() { return mValue; } private final int mValue; },java,android,enums,jvm,Java,Android,Enums,Jvm,从上面的代码中,我应该得到: Test1.toInt()->2,Test2.toInt()->3,Test3.toInt()->4,Test4.toInt()->7,Test5.toInt()->8 这段代码在经过测试的Android Java虚拟机上运行良好,但是我不确定它是否是有效的Java代码,以及它是否能在所有有效的Java虚拟机上正常工作,因为AFAIK enum在静态字段之前初始化,但在这种情况下,带静态字段的嵌套类的按需初始化似乎运行良好(如果没有嵌套类,简单的静态字段不起作用)
Patryk
计数器持有人
将始终在初始化ETest
之前加载并初始化,因此您的代码应在所有兼容JVM上按预期工作。您可以在中阅读有关类初始化的更多信息(不确定android的等效文档是什么,但我希望它们的措辞非常相似).特别是:
类或接口类型T
将在第一次出现以下任一情况之前立即初始化:
- [……]
- 使用由
声明的静态字段,该字段不是常量变量T
CounterHolder
类将在ETest
的第一个构造函数运行之前加载并初始化
但是请注意,从样式的角度来看,只写以下内容可能会更简洁:
enum ETest {
Test1(2),
Test2(3),
Test3(4),
Test4(7),
Test5(8);
}
实际上,您可以像这样在枚举内部使用
public enum TestEnum {
Test1(2),
Test2,
Test3,
Test4(7),
Test5;
private static Map<TestEnum, Integer> map = new HashMap<>();
static {
int counter = 0;
for (TestEnum enun : TestEnum.values()) {
counter = Math.max(counter, enun.value);
if (enun.value == 0) {
counter++;
}
map.put(enun, counter);
}
}
private int value;
TestEnum() {
value = 0;
}
TestEnum(int pValue) {
value = pValue;
}
public int toInt() {
return map.get(this);
}
}
输出为:
Test1 = 2
Test2 = 3
Test3 = 4
Test4 = 7
Test5 = 8
提示:检查一个名为的东西,它是枚举常量的序数(它在枚举声明中的位置,初始常量被指定为零序数)
在android中,最佳做法是避免使用Enum,主要原因是基于android文档的反优化性能: 枚举通常需要的内存是静态枚举的两倍以上 您应该严格避免在Android上使用枚举 另一方面,解决方案使用类型def注释: @IntDef注释基本上可以创建一个“typedef”,其中 您可以创建另一个表示有效整数的注释 常量,然后用它装饰API typedef注释 下面是一个示例,说明如何使用它(天数检查器…): 要了解更多功能,您可以阅读官方文档:
不要试图将C++结构转换成Java .java枚举方法,以作为简单的C++样式值容器来滥用。我确信代码不能编译。请在问题中使用真实代码……java代码编译好了,因为我使用了按需初始化,我不确定它是否不会在运行时引起问题。我在其他JVM .@ TyMyTutle上,但是我只需要这个强大的枚举来作为C++的简单值容器,没有更多的,所以如果这个类型真的是强大的,正如你所说的,我应该能够做到这一点,但是我们会看到。@ PATRYKNADROWSKY”,但是我只需要这个强大的枚举来作为C++的简单值容器。我想你的意思是:我想坚持C++程序员认为OOP是……o,谢谢。但是我不希望HashMap的开销与这类简单的任务有关。当然,由于
value
不是final
,静态初始值设定项可以覆盖零值而不是填充映射,并且toInt
可以像以前一样工作…
Test1 = 2
Test2 = 3
Test3 = 4
Test4 = 7
Test5 = 8