Названня переліків на Java: однина чи множина?


184

Чи існує "офіційна" рекомендація щодо того, як назвати переліків Java?

enum Protocol { HTTP, HTTPS, FTP }

або

enum Protocols { HTTP, HTTPS, FTP }

Я знаю, що у світі .Net рекомендується використовувати однини за винятком переліків, які представляють бітові прапори. Просто цікаво, чи є щось подібне в Java.

Пов'язане запитання, яке, схоже, є. Net специфічним: однина чи множина для перерахунку?


3
Ви можете знайти відповідь тут . Переліки - це класи, це означає, що ви повинні оголосити їх так само.
bsiamionau

Відповіді:


220

Енуми на Java (і, мабуть, перерахунки взагалі) повинні бути поодинокими. Мислення полягає в тому, що ви не вибираєте кілька протоколів, а один протокол можливих варіантів у списку значень.

Зверніть увагу на відсутність множини: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html


2
Microsoft , здається, тримає приблизно така ж думка про програмування .NET: stackoverflow.com/a/1336012/279112
Panzercrisis

Чому TimeUnit використовує множини? напр .: DAYS, HOURS...
oniuv

4
Значення множинні, перерахунок не такий :-)
Калвін

21

Так само, коли ви визначаєте ім'я таблиці в базі даних або клас на Java, ви використовуєте сингулярне значення для перерахунків, це також найкращий варіант. Подивіться, як ви збираєтесь ним користуватися.

Напишемо приклад:

public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

class Appointment {
private Day day;

public void setDay(Day day) {
    this.day = day;
}
}

У формі однини ви чітко бачите атрибут наміру дня. "день" - це день тижня, який буде проведено. Інакше підпис методу був би встановленийDay (Days day), і напевно багато людей будуть задаватися питанням, чи може призначення відбутися за один день.

Якщо ви працюєте в компанії, у неї 48 годинних змін, ви можете спробувати визначити щось на кшталт:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Таким чином ви могли б встановити дні, коли збираєтесь працювати. Але все одно це буде виглядати дивно, і є кращий варіант і використовувати форму однини:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Тепер ви дійсно показуєте значення перерахунку. Зазвичай у будь-якому домені ви виявите, що використання однини для перерахунку є найкращим варіантом, оскільки кожна константа в enum - це лише один елемент.

Ви також згадуєте .NET. Перерахування "прапорів" у .NET просто означає, що коли ви очікуєте, що enum як параметр, ви дійсно отримаєте перелік елементів цього enum (зберігається як ціле число).

// Define an Enum with FlagsAttribute.
[FlagsAttribute] 
enum MultiHue : short
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4
};

public void setMultiHue(MultiHue hues);

Ви можете зробити те ж саме в Java, але перелік все ще буде єдиним:

public enum Hue {
BLACK, RED, GREEN, BLUE;
private final Integer hue;

Hue() {
    this.hue = 1 << this.ordinal();
}

public Integer toFlag() {
    return this.hue;
}
}

public class MultiHue {
private Integer hues = 0;

public void addHue(Hue hue) {
    this.hues |= hue.toFlag();
}

public boolean hasHue(Hue hue) {
    return (this.hues & hue.toFlag()) != 0;
}
}

Простіше і зрозуміліше (хоча для цього використовується більше пам’яті) зробити це з Java - це просто використовувати Список.


2
Насправді, кращим способом зробити це буде EnumSet, який інкапсулює BitSet і піклується про все це для вас. :-)
corsiKa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.