Подтвердить что ты не робот

Enum объявлен вне класса

Я пошел на это интервью для позиции разработчика программного обеспечения, и они дали мне тест с некоторыми ситуациями с кодовым кодом, обычно 4 варианта для выбора.
В одном из вопросов было указано перечисление вне класса, я быстро проверил ответ "не компилировал" и пошел дальше с другими вопросами. Это было что-то вроде:

enum Colors {BLUE,RED,GREEN}

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Дополнительная информация: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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