【问题标题】:How to define static constants in a Java enum?如何在 Java 枚举中定义静态常量?
【发布时间】:2014-06-29 19:22:01
【问题描述】:

有没有办法在 Java 枚举声明中定义静态最终变量(实际上是常量)?

我想要的是在一个地方定义 BAR(1...n) 值的字符串文字值:

@RequiredArgsConstructor
public enum MyEnum {
    BAR1(BAR_VALUE),
    FOO("Foo"),
    BAR2(BAR_VALUE),
    ...,
    BARn(BAR_VALUE);

    private static final String BAR_VALUE = "Bar";

    @Getter
    private final String value;
}

对于上面的代码,我收到以下错误消息:Cannot reference a field before it is defined

【问题讨论】:

  • 为什么会有这么多具有​​相同值的枚举?这似乎完全违背了枚举的习惯!
  • 错误文本是您问题的答案!
  • @Juvanis:注意每个枚举实例都有自己唯一的名称,所以我不认为它违反了枚举的习惯用法。在我的情况下, MyEnum 的实例充当映射的键,我还希望将这些键输出到外部目标。根据规范,这些输出值在某些情况下碰巧是相同的。
  • @KishanSarsechaGajjar:不,答案不存在。我试图将常量声明放在首位,但又出现了一个编译错误。
  • 这个工程 public enum MyEnum { BAR1(MyEnum.BAR_VALUE), FOO("Foo"), BAR2(MyEnum.BAR_VALUE), BARn(MyEnum.BAR_VALUE);私有静态最终字符串 BAR_VALUE = "酒吧";私有最终字符串值; MyEnum(final String value){ this.value =value; } }

标签: java enums constants


【解决方案1】:
public enum MyEnum {
    BAR1(MyEnum.BAR_VALUE);

    public static final String BAR_VALUE = "Bar";

工作正常

【讨论】:

  • 我没有看到这个答案添加到现有和接受的答案的任何方面。您能否通过提供解释进一步澄清您的答案?
  • @Snickbrack 我愿意。它消除了静态嵌套类。很好的答案。
  • 大写语法会不会导致枚举值和常量混淆?
  • @borjab 是的,如果你使用那个方法,你不能有一个常量和一个同名的枚举
  • 你有解释为什么会这样吗?我想知道为什么显式使用MyEnum 会有所不同,因为隐式它已经存在了。
【解决方案2】:

正如 IntelliJ IDEA 在提取常量时建议的那样 - 制作静态嵌套类。这种方法有效:

@RequiredArgsConstructor
public enum MyEnum {
    BAR1(Constants.BAR_VALUE),
    FOO("Foo"),
    BAR2(Constants.BAR_VALUE),
    ...,
    BARn(Constants.BAR_VALUE);



    @Getter
    private final String value;

    private static class Constants {
        public static final String BAR_VALUE = "BAR";
    }
}

【讨论】:

  • 我认为应该注意@RequiredArgsConstructor 来自lombok 库。
  • 虽然这个不适用于在注释值中使用“常量”。
  • @BrunoLeite 如果您将Constants 类设为非private,这确实适用于在注释值中使用常量。
  • '静态内部'是一个矛盾的术语。
  • @user207421 是静态嵌套的。谢谢:)
【解决方案3】:
public enum MyEnum {
//  BAR1(       foo),   // error: illegal forward reference
//  BAR2(MyEnum.foo2),  // error: illegal forward reference
    BAR3(MyEnum.foo);   // no error

  public static final int foo =0;
  public static       int foo2=0;
  MyEnum(int i) {}

  public static void main(String[] args) { System.out.println("ok");}
}

这可以在没有常量内部类的情况下完成。

【讨论】:

    【解决方案4】:

    也许你应该考虑把这个枚举分成两个字段:一个枚举和一个整数:

    @RequiredArgsConstructor
    public enum MyEnum {
        BAR("Bar"),
        FOO("Foo")
    
        @Getter
        private final String value;
    }
    

    然后使用:

    private MyEnum type;
    private int value;
    

    (你可以把它放到一个类中,不管它是否对你有意义)

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2017-12-26
      相关资源
      最近更新 更多