枚举内的私有静态最终变量

2022-09-01 14:00:43

我试图在枚举内创建一个私有的静态最终变量,但我不断收到编译错误。有谁知道如何解决这个问题?

此行上的多个标记

  • 语法错误,插入“标识符”以完成 EnumConstantHeaderName
  • 语法错误,插入“}”以完成枚举体
class Foo {
  ...

  public enum MyEnum {
    private static final String MY_STRING = "a string I use in a constructor";
    private static final String MY_OTHER_STRING = "a string I use in another constructor";      

    MyEnumType(1, MY_STRING),
    MyEnumType2(2, MY_STRING),
    MyEnumType3(3, MY_OTHER_STRING);

    MyEnum(int num, String str) {
      ...
    } 
  }
 ...
}

答案 1

枚举常量必须是枚举中的第一个元素。编译以下内容的代码版本:

class Foo {

    public enum MyEnum {
        MyEnumType, MyEnumType2;

        public String bar() {
            return MY_STRING;
        }

        public String bar2() {
            return MY_STRING + "2";
        }

        private static final String MY_STRING = "a string I reuse in the enum";
    }
}

* 编辑 *

根据对原始问题所做的编辑,我看到了您要做什么。不,不可能在枚举定义本身声明中声明的枚举文本声明中使用常量。这是因为文字声明必须是枚举中的第一个元素。这是由 Java 语言规范规定的。不过有两件快速的事情:

  1. 您正在使用 .与使用字符串文本相比,这绝对没有任何好处,这将解决问题。private static final Strings
  2. 如果要声明可重用常量 (),则需要在枚举之外执行此操作。public static final Strings

或者,您可以将枚举声明为为您定义 的类的嵌套元素。private static final String

一些伪代码:

public class Foo {
    public static enum MyEnum {
        MyEnumType(0, MY_STRING), MyEnumType2(1, "Hello");

        private int ordinal;
        private String value;

        MyEnum(int ordinal, String value) {
            this.ordinal = ordinal;
            this.value = value;
        }

        public int getOrdinal() {
            return ordinal;
        }

        public String getValue() {
            return value;
        }

        public void setOrdinal(int ordinal) {
            this.ordinal = ordinal;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

    private static final String MY_STRING = "a string I reuse in the enum";
}

答案 2

这是可能的,你只需要直接引用变量。

class Foo {
  ...

  public enum MyEnum {

    MyEnumType(1, MyEnum.MY_STRING),
    MyEnumType2(2, MyEnum.MY_STRING),
    MyEnumType3(3, MyEnum.MY_OTHER_STRING);

    MyEnum(int num, String str) {
      ...
    }

     private static final String MY_STRING = "a string I use in a constructor";
     private static final String MY_OTHER_STRING = "a string I use in another constructor";  
  }
 ...
}