Java Enum без инкапсуляции в классе - PullRequest
4 голосов
/ 25 мая 2010

У меня есть ситуация, когда мне нужно перечисленное ниже перечисление Checker, используемое в нескольких классах:

package Sartre.Connect4;

public enum Checker {
    EMPTY,
    RED,
    YELLOW
}

поэтому я помещаю Checker в файл Checker.java, а затем из классов, которые в нем нуждаются, просто делаю следующее:

пример:

    public Cell(){

    currentCell = Checker.EMPTY;

}

пример:

    public Cell(Checker checker){

    currentCell = checker;
}

и код прекрасно компилируется и работает нормально.

так в чем же мой вопрос? хорошо, будучи новичком в Java, мне просто интересно, является ли способ, которым я использую Checker без инкапсуляции его в классе, является разумной реализацией?

это может быть из-за Объявление enum определяет класс (называемый тип enum). , как отмечено на странице учебника по перечислению Java docs.

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

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

Другой полезный трюк, когда вы часто используете определенное значение перечисления в каком-либо другом исходном файле, - import static это значение. Это позволяет вам использовать его без необходимости квалифицировать его (конечно, при условии, что оно не является двусмысленным). Некоторые люди недовольны этой техникой, но мне она нравится, потому что она делает использование более чистым, и ваша IDE всегда может точно сказать вам, что происходит. (Я не рекомендую писать Java без IDE, чтобы поддержать вас.)

2 голосов
/ 25 мая 2010

Да, это прекрасно.

Хотя, если Checker используется только этим классом, вы можете определить его как статический внутренний класс:

public class Cell {

   public Cell(Checker checker) {..}
   // remainder omitted

   public static enum Checker { EMPTY, RED, YELLOW };
}

И построить Cell, вызвав:

Cell cell = new Cell(Cell.Checker.RED);

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

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