Соглашения о кодировании - перечисления имен - PullRequest
264 голосов
/ 18 июня 2010

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

Я предпочитаю, чтобы перечисление было типом.Так, например, у вас есть перечисление

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

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

Я против присвоения ему имени:

FruitEnum
NetworkConnectionTypeEnum

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

NetworkConnectionClass
FruitClass

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

Ответы [ 7 ]

432 голосов
/ 18 июня 2010

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

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

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

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

71 голосов
/ 31 июля 2013

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

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

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

19 голосов
/ 18 июля 2015

Как уже говорилось, экземпляры 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's" и в классе (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 иногда обмениваются соглашениями с удобством.

13 голосов
/ 18 июня 2010

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

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

Ссылка на него в кодевыглядит так: Fruit.Fruits.Apple, Fruit.Fruits.Pear и т. д.

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

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

7 голосов
/ 18 июня 2010

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

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

Лучшее справочное руководство по именованию констант можно найти в учебнике Переменные :

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

0 голосов
/ 03 мая 2018

Если я могу добавить свои $ 0,02, я предпочитаю использовать PascalCase в качестве значений перечисления в C.

В C они в основном глобальные, а PEER_CONNECTED становится действительно утомительным, а не PeerConnected.

Дыхание свежего воздуха.

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

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

import static pkg.EnumClass.*;

Теперь вы можете использовать неквалифицированные имена, которые вы уже определили другим способом.

В настоящее время я (думаю) о переносе некоторого кода C на Java и в настоящий момент «разрываюсь» между выборомСоглашение Java (которое является более многословным, более длинным и более уродливым) и мой стиль C.

PeerConnected стал бы PeerState.CONNECTED, за исключением операторов switch, где он CONNECTED.

Теперь естьМногое можно сказать о последнем соглашении, и оно выглядит красиво, но некоторые «идиоматические фразы», ​​такие как if (s == PeerAvailable), становятся похожими на if (s == PeerState.AVAILABLE), и с ностальгией это теряет смысл для меня.

Я думаю, что я все еще предпочитаю стиль Java из-за ясности, но мне трудно смотреть на кричащий код.

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

0 голосов
/ 11 апреля 2018
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 }
}

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

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