Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有静态计数器的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 - Fatal编程技术网

带有静态计数器的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-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在静态字段之前初始化,但在这种情况下,带静态字段的嵌套类的按需初始化似乎运行良好(如果没有嵌套类,简单的静态字段不起作用)

从上面的代码中,我应该得到: 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