Частная статическая конечная переменная внутри перечисления - программирование
Подтвердить что ты не робот

Частная статическая конечная переменная внутри перечисления

Я пытаюсь создать приватную статическую конечную переменную внутри перечисления, но я продолжаю получать ошибку компиляции. Кто-нибудь знает, как это исправить?

Несколько маркеров в этой строке

  • Ошибка синтаксиса, вставьте "Идентификатор" для завершения EnumConstantHeaderName
  • Ошибка синтаксиса, вставьте "}" для завершения EnumBody
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) {
      ...
    } 
  }
 ...
}
4b9b3361

Ответ 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";
    }
}

* РЕДАКТИРОВАТЬ *

Исходя из изменений, внесенных в ваш первоначальный вопрос, я вижу, что вы пытаетесь сделать. Нет возможности использовать константы в ваших объявлениях перечисления enum, которые объявлены в самом определении перечисления. Это потому, что литералы должны быть первыми элементами в перечислении. Это предусмотрено спецификацией Java Language Specification. Две быстрых вещи:

  • Вы используете private static final Strings. Это дает вам абсолютно никакой пользы от использования струнных литералов, которая решила бы проблему.
  • Если вы хотите объявить повторно используемые константы (public static final Strings), вам нужно сделать это вне перечисления.

В качестве альтернативы вы можете объявить свои Enums как вложенные элементы класса, который определяет 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";  
  }
 ...
}

Ответ 3

Интерфейс можно использовать:

class Foo {
  ...

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

  public enum MyEnum implements MyEnumConstants {
    MyEnumType(1, MY_STRING),
    MyEnumType2(2, MY_STRING),
    MyEnumType3(3, MY_OTHER_STRING);

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