Соглашения о кодировании - перечисление имен

Есть ли соглашение об именах перечислений в Java?

Мое предпочтение состоит в том, что перечисление является типом. Так, например, у вас есть перечисление

Fruit{Apple,Orange,Banana,Pear, ... }

NetworkConnectionType{LAN,Data_3g,Data_4g, ... }

Я против его именования:

FruitEnum
NetworkConnectionTypeEnum

Я понимаю, что легко выбрать, какие файлы перечислены, но тогда у вас также будет:

NetworkConnectionClass
FruitClass

Кроме того, есть ли хороший документ, описывающий то же самое для констант, где объявлять их и т.д.?

Ответ 1

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

enum Fruit {APPLE, ORANGE, BANANA, PEAR};

Нет причин для написания FruitEnum больше, чем FruitClass. Вы просто теряете четыре (или пять) символов, которые не добавляют никакой информации.

Сама Java рекомендует этот подход, и используется в своих примерах.

Ответ 2

Это, вероятно, не заставит меня много новых друзей, но следует добавить, что у людей С# есть другое руководство: экземпляры перечисления - это "случай Pascal" (смешанный верхний/нижний регистр). См. обсуждение stackoverflow и Принципы именования типов перечислений MSDN.

Когда мы обмениваемся данными с С# -системой, у меня возникает соблазн скопировать их перечисления точно, игнорируя соглашение Java "константы имеют имена в верхнем регистре". Размышляя об этом, я не вижу большого значения в ограничении на верхний регистр для экземпляров enum. Для некоторых целей .name() - удобный ярлык для получения читаемого представления константы перечисления, и имя смешанного регистра будет выглядеть лучше.

Итак, да, я осмеливаюсь рассказать о значении соглашения об именах перечислений Java. Тот факт, что "другая половина мира программирования" действительно использует другой стиль, заставляет меня думать, что законно сомневаться в нашей собственной религии.

Ответ 3

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

Итак, для вашего примера с фруктами у нас будет класс Fruit, а внутри этого Enum называется Fruits.

Ссылка на это в коде выглядит следующим образом: Fruit.Fruits.Apple, Fruit.Fruits.Pear и т.д.

Константы следуют по одной и той же строке, где они либо определяются в классе, к которому они относятся (что-то вроде Fruit.ORANGE_BUSHEL_SIZE); или если они применяют общесистемное (то есть эквивалентное "значение null" для ints) в классе с именем "ConstantManager" (или эквивалент, например ConstantManager.NULL_INT). (боковое примечание, все наши константы находятся в верхнем регистре)

Как всегда, ваши стандарты кодирования, вероятно, отличаются от моих; поэтому YMMV.

Ответ 4

Как уже указывалось, экземпляры enum должны быть прописными в соответствии с документами на веб-сайте Oracle (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).

Однако, просматривая учебник JavaEE7 на веб-сайте Oracle (http://www.oracle.com/technetwork/java/javaee/downloads/index.html), я наткнулся на учебник "Duke bookstore" и в классе (tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java) я нашел следующее определение перечисления:

private enum PropertyKeys {
    alt, coords, shape, targetImage;
}

В соответствии с соглашениями он должен выглядеть следующим образом:

public enum PropertyKeys {
    ALT("alt"), COORDS("coords"), SHAPE("shape"), TARGET_IMAGE("targetImage");

    private final String val;

    private PropertyKeys(String val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return val;
    }
}

Так кажется, даже ребята из Oracle иногда торгуют с удобством.

Ответ 5

Они все еще являются типами, поэтому я всегда использую те же соглашения об именах, которые я использую для классов.

Я определенно нахмурился бы поставить "Класс" или "Перечисление" в имени. Если у вас есть как FruitClass, так и FruitEnum, тогда что-то еще не так, и вам нужно больше описательных имен. Я пытаюсь подумать о коде, который привел бы к необходимости обоих, и кажется, что должен быть базовый класс Fruit с подтипами вместо enum. (Это только мои собственные предположения, хотя, у вас может быть другая ситуация, чем то, что я представляю.)

Лучшая ссылка, которую я могу найти для констант именования, получена из Редактор переменных:

Если имя, которое вы выбираете, состоит только из одного слова, произносите это слово во все строчные буквы. Если он состоит из более чем одного слова, запишите первую букву каждого последующего слова. Названия gearRatio и currentGear являются яркими примерами этого соглашения. Если ваша переменная хранит постоянное значение, такое как статическое окончательное int NUM_GEARS = 6, соглашение изменяется незначительно, заглавная буква каждой буквы и разделяя последующие слова символом подчеркивания. По соглашению символ подчеркивания никогда не используется в другом месте.

Ответ 6

enum MyEnum {VALUE_1,VALUE_2}

(приблизительно), как говоря

class MyEnum {

    public static final MyEnum VALUE_1 = new MyEnum("VALUE_1");
    public static final MyEnum VALUE_2 = new MyEnum("VALUE_2");

    private final name;

    private MyEnum(String name) {
        this.name = name;
    }

    public String name() { return this.name }
}

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