Можно ли / возможно изменить переменные экземпляра внутри объявления enum? - PullRequest
0 голосов
/ 22 февраля 2011

Или, если перефразировать его: могут ли типы перечисления быть "изменяемыми"?

public enum Foo {
    ONE,TWO;

    private String bar;

    Foo() { this.bar = ""; }
    String bar() { return bar; }

    // legal?
    void bar(String bar) { this.bar = bar; }
}

Полагаю, если я хочу изменить его, это уже не тип перечисления.

Мысли?

1 Ответ

4 голосов
/ 22 февраля 2011

Это абсолютно верно. Это просто очень плохая идея. Абоненты могут ожидать, что перечисление будет должным образом неизменным. В некоторых случаях вы можете захотеть сделать так, чтобы он «казался» неизменным, например, с кэшированием, в то же время изменяя внутренние переменные ... но это очень важный случай.

Что касается того, почему Java позволяет вам делать это ... даже если бы все переменные-члены были конечными, это не сделало бы значения перечисления истинно неизменяемыми ... например, вы могли бы иметь List<String>, который изменялся каждый раз, когда вы вызывали определенный метод ...

По сути, Java не очень хороша для обеспечения неизменности.

...