Где использовать перечисляемые типы - PullRequest
0 голосов
/ 05 августа 2011

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

Если это поможет, мои конструкторы принимают значение даты, месяца и года (например, 5, 8, 2011).

Ответы [ 2 ]

1 голос
/ 05 августа 2011

перечисления являются оружием выбора при работе с конечным набором значений того же типа. Например:

public enum Month {
    JANUARY,
    FEBRUARY,
    MARCH,
    APRIL,
    ... etc
}

Это делает их использование строго типизированными .

Вы можете указать методы для принятия enum в качестве параметров, например:

private Month month;
public void setMonth(Month month) {
    this.month = month;
}

Альтернативой является использование констант String (или int), часто называемых строковым типом , но такие константы не являются типизированными - методы, принимающие Strings, будут принимать any String - например, "Foo «:

private String month;
public void setMonth(String month) {
    this.month = month; // Will accept "Foo"
}

enum может использоваться (в основном) как обычные классы - у вас могут быть конструкторы (private), поля и методы, например:

public enum Month {
    JANUARY("January",
    FEBRUARY("February",
    ... 
    DECEMBER("December");

    private final name;

    private Month(String name) { // Constructors must be private
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Вы даже можете иметь сеттеры, потому что перечисления не обязательно должны быть неизменяемыми (их поля не должны быть окончательными), но это не рекомендуется.

РЕДАКТИРОВАНИЕ: Подробнее

перечисления не могут extends, но могут implements, поэтому, если у вас было несколько типов Месяцев (для разных Календарей), вы можете сделать это, чтобы сохранить строгую типизацию. Вот и пример абстракции календаря и месяца

interface Month {
}

enum GregorianMonth implements Month {
}

enum ChineseMonth implements Month {
}

abstract class Calendar<T extends Enum<T> & Month> { // T must be both an enum and a Month
    T month;

    void setMonth(T month) {
        this.month = month;
    }
}

class GregorianCalendar extends Calendar<GregorianMonth> {

}

class ChineseCalendar extends Calendar<ChineseMonth> {

}
0 голосов
/ 05 августа 2011

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

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

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