Enum объявлен вне области видимости класса - PullRequest
12 голосов
/ 01 октября 2009

Я пошел на это собеседование на должность разработчика программного обеспечения, и они дали мне тест с некоторыми ситуациями с угловым регистром, обычно с четырьмя вариантами выбора.
У одного из вопросов был объявлен enum вне области класса, я быстро проверил ответ «не компилирует» и продолжил другие вопросы. Это было что-то вроде:

enum Colors {BLUE,RED,GREEN}

class Test {
    //other code, not really important with my question
}

Этот код фактически компилируется.
Помимо того факта, что подобное собеседование (может или нет) может оказаться бесполезным, чтобы выяснить, является ли кто-то хорошим разработчиком, меня беспокоит то, почему я объявляю перечисление как это? Почему я могу сделать это только с enum? Я провел некоторое тестирование и обнаружил, что оно видно внутри класса, но не для других классов.

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

Ответы [ 5 ]

10 голосов
/ 01 октября 2009

Это не просто перечисления. Перечисления - это просто особые виды занятий. В общем случае вы можете иметь несколько классов, объявленных в одном файле (если только два из них не являются общедоступными).

6 голосов
/ 01 октября 2009

Нет, без модификатора доступа enum является частным для пакета. Это означает, что он может использоваться только классами в одном пакете. И вы не можете сделать это только с помощью enum, классы также можно сделать закрытыми для пакета.

Подробнее: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

1 голос
/ 01 октября 2009

Иногда эта идиома может быть разумной - например, представьте, что у вас есть класс UploadHandler (или что-то в этом роде), который может возвращать статус из загрузки. Мне представляется вполне возможным реализовать этот статус как enum - и, поскольку enum (например, UploadStatus) явно «принадлежит» классу UploadHandler, кажется, можно объявить его в том же исходном файле. (Это, конечно, предполагает, что он должен быть только закрытым для пакета - если он действительно общедоступный, его нужно объявить в своем собственном файле, что, вероятно, имело бы смысл, если бы оно больше не было внутренним).

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

0 голосов
/ 01 октября 2009

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

0 голосов
/ 01 октября 2009

На самом деле он компилируется на моем Eclipse! ; -)

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

Это видимость «пакет», поэтому он должен быть виден и в других классах в том же пакете.

Что я могу сделать с этим перечислением?

Вы можете делать все, что захотите, с указанными выше ограничениями ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...