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

Здесь описано, как добавлять строки и столбцы. Возможно, вам придется перезагрузить / обновить элемент управления после добавления элементов.

55
задан user2864740 17 June 2014 в 09:38
поделиться

5 ответов

Перечисления являются статическими вложенными классами, потому что они определяют статические членские переменные (перечислимые значения), и это запрещено для внутренних классов: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.3

Обновление: Я просматривал JLS (спецификация языка Java) для большего количества детали об ограничениях статических вложенных классов, и не нашел его (хотя это, вероятно, там, скрыто под другой темой). С чистой точки зрения реализации нет никакой причины, что это не могло быть сделано. Таким образом, я подозреваю, что это была проблема философии языка: это не должно быть сделано, поэтому не будет поддерживаться. Но я не был там, таким образом, это - чистое предположение.

Как комментарий: если Ваши методы являются достаточно большими, что они требуют своих собственных перечислений, то это - сильный знак, что Вам нужен рефакторинг.

38
ответ дан AdrieanKhisbe 7 November 2019 в 07:28
поделиться

Это странно, потому что Java, внутреннее определение класса говорит, что константы времени компиляции могут быть объявлены статичные, и член Перечисления, является постоянным явно временем компиляции, плюс перечисление статический класс, предположительно...

Документация:

8.1.3 Внутренние классы и экземпляры включения

(...) Внутренние классы не могут объявить статических участников, если они не время компиляции постоянные поля.

class Outer{
    class Inner extends HasStatic{
        static final int x = 3;         // ok - compile-time constant
        static int y = 4;           // compile-time error, an inner class
    }
    static class NestedButNotInner{
        static int z = 5;           // ok, not an inner class
    }
    interface NeverInner{}              // interfaces are never inner
}
3
ответ дан no_ripcord 7 November 2019 в 07:28
поделиться

Я редко пишу любые типы в рамках метода, если это не анонимный внутренний класс. Можно, однако, записать вложенные перечисления:

public class NestedEnum
{
    private enum MyEnum
    {
        X, Y, Z
    }

    public void foo()
    {
    }
}

Я не думаю, что действительно хотел бы прочитать метод, который объявил новый тип в нем - у Вас есть какая-либо конкретная причина желания объявить это в методе вместо так же, как вложенный тип? Я вижу, что "никакие другие методы не должны знать" аргумент, но я думаю, что комментарий может уладить это и все еще оставить больше читаемого кода.

15
ответ дан Jon Skeet 7 November 2019 в 07:28
поделиться

http://mindprod.com/jgloss/enum.html дает хорошее описание перечислений Java - так же ранее упомянутый, перечисления определяются столь же статичные, таким образом, они не могут быть объявлены как местные жители

2
ответ дан Peter 7 November 2019 в 07:28
поделиться
  1. "Вложенные перечислимые типы неявно static. " 8.9 Enums

  2. Разумно предположить, что вложенные перечисления неявно содержат модификатор статического доступа.

  3. "Это ошибка времени компиляции, если объявление локального класса содержит любые один из следующих вариантов доступа модификаторы: общедоступные, защищенные, частный или статический ». 14,3 14,3 Локальный Объявления классов
10
ответ дан 7 November 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: