2013-12-13 3 views
1

В чем причина их создания? Например, я могу захотеть иметь внутреннее перечисление, которое будет использоваться как свойство охватывающего класса, а затем в зависимости от этого значения свойства возвратит одно из двух различных свойств охватывающего класса, которые реализуют один и тот же интерфейс, например, здесьПочему вложенные перечисления неявно статичны в java?

Но я не могу написать такой код, как я не могу ссылаться на Moo.this.oe1 или oe2, поскольку они находятся в нестационарном контексте и в перечислении я в нем.

+1

Что? Пожалуйста, отформатируйте свой код и попробуйте объяснить с помощью некоторого примера кода. – zapl

+0

Почему довольно сложный вопрос для ответа. Потому что спецификации говорят так. Почему они так говорят? Я бы предположил, что авторы спектакля думали, что это вызовет больше неприятностей, чем счастье, если бы объектив Hey отличался от Heb. – flup

+0

Частично, перечисления являются запоздалой мыслью в Java и чем-то вроде компилятора, поэтому вы получаете то, что получаете. Но перечисления на самом деле не очень «подходят» на любом языке (у Паскаля, вероятно, есть лучшая «подгонка», и это хорошо, но не очень), так что всегда есть нерегулярное чувство о них. –

ответ

2

Это не будет иметь никакого смысла, если вы сделаете экземпляр уровня (не статический) внутренний класс перечислимого - если экземпляры перечисления были привязаны к внешнему классу они будут нарушать гарантии перечислимой

С docs:

обсуждения

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

Типы перечислений (§8.9) не должны быть объявлены абстрактными; это приведет к ошибке во время компиляции. Это ошибка времени компиляции для типа перечисления E , чтобы иметь абстрактный метод m в качестве члена, если E не имеет одной или нескольких констант enum , а все константы перечисления E имеют тела классов, которые обеспечивают конкретные реализации m. Это ошибка времени компиляции для тела класса константы enum для объявления абстрактного метода.

Тип перечисления является неявным окончательным, если он содержит хотя бы одно перечисление константа, которая имеет тело класса. В любом случае, ошибка компиляции явно объявляет тип перечисления окончательным.

Вложенные типы перечислений неявно статичны. Допустимо, что явно объявляет вложенный тип перечисления статическим.

Также this:

типа перечисление не имеет отличных от тех, которые определены его перечисления констант экземпляров. Ошибка компиляции для попытки явно указать экземпляр типа перечисления (§15.9.1).

+0

Это, вероятно, справедливо только в одном загрузчике классов. –

Смежные вопросы