Konvensi Pengkodean - Penamaan Enum

289

Apakah ada konvensi untuk penamaan enumerasi di Jawa?

Preferensi saya adalah enum adalah tipe. Jadi, misalnya, Anda memiliki enum

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

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

Saya menentang menyebutnya:

FruitEnum
NetworkConnectionTypeEnum

Saya mengerti mudah untuk memilih file mana yang enum, tetapi Anda juga harus:

NetworkConnectionClass
FruitClass

Juga, apakah ada dokumen bagus yang menggambarkan hal yang sama untuk konstanta, di mana harus mendeklarasikannya, dll?

Walter White
sumber
2
Tolong jadikan ini Wiki Komunitas. Karena tidak ada jawaban tunggal yang dapat diterima, dan itu akan ditutup sebaliknya.
Alexander Pogrebnyak
13
@Alexander Pogrebnyak Tidak, ada jawaban.
Tom Hawtin - tackline

Jawaban:

473

Enum adalah kelas dan harus mengikuti konvensi untuk kelas. Contoh enum adalah konstanta dan harus mengikuti konvensi untuk konstanta. Begitu

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

Tidak ada alasan untuk menulis FruitEnum lebih dari FruitClass. Anda hanya membuang empat (atau lima) karakter yang tidak menambahkan informasi.

Java sendiri merekomendasikan pendekatan ini dan digunakan dalam contoh mereka .

DJClayworth
sumber
22
Saya mulai memberi nama enum saya dengan cara itu, tetapi untuk keterbacaan, saya sekarang telah menggunakan Fruit.Apple daripada Fruit.APPLE.
38
@Walter Mengapa membuat instance enum terlihat seperti kelas yang meningkatkan keterbacaan?
DJClayworth
17
Secara teknis, instance enum adalah kelas. Itu sebabnya mereka dapat memiliki metode.
Ted Hopp
87
Tidak, instance enum adalah instance. Enum adalah kelas.
DJClayworth
30
Ide pola penamaan yang membuat saya mengetik Fruit.APPLE.chew () benar-benar mengganggu saya. Juga, meskipun itu akan menjadi praktik yang sangat buruk, APPLE tidak harus konstan (tidak berubah). Dengan promosi enum ke kelas java penuh, saya tidak yakin menggunakan konvensi yang dikembangkan untuk sesuatu yang bahkan tidak ada di c (Objects, not enums) selalu masuk akal
Bill K
76

Ini mungkin tidak akan membuat saya banyak teman baru, tetapi harus ditambahkan bahwa orang-orang C # memiliki pedoman yang berbeda: Contoh enum adalah "Pascal case" (campuran huruf besar / kecil). Lihat diskusi stackoverflow dan Pedoman Penamaan Jenis Pencacahan MSDN .

Saat kami bertukar data dengan sistem C #, saya tergoda untuk menyalin enum mereka dengan tepat, mengabaikan konvensi Java "constants have namesname". Memikirkan tentang itu, saya tidak melihat banyak nilai yang dibatasi pada huruf besar untuk contoh enum. Untuk beberapa tujuan .name () adalah jalan pintas yang berguna untuk mendapatkan representasi yang dapat dibaca dari konstanta enum dan nama case campuran akan terlihat lebih bagus.

Jadi, ya, saya berani mempertanyakan nilai konvensi penamaan Java enum. Fakta bahwa "setengah dari dunia pemrograman" memang menggunakan gaya yang berbeda membuat saya berpikir itu sah untuk meragukan agama kita sendiri.

StaticNoiseLog
sumber
7
TIL bahwa hanya programmer Java atau C # yang merupakan programmer nyata, dan jumlahnya sama. #sarcasm
Mindwin
14
C # adalah bahasa yang bagus, tetapi ini benar-benar konyol. Semuanya cukup banyak kasus pascal dalam C #, yang pada dasarnya sama dengan tidak memiliki konvensi penamaan sama sekali; Anda tidak mendapatkan apa-apa dengan melihat nama. Anda tidak tahu apakah itu kelas, metode, properti, dll.
Bassinator
3
Juga, boolean bisa dibilang enum, instansnya benar dan salah, dalam huruf kecil. Jadi ya, semua topi jelek.
Florian F
@FlorianF, jangan bingung tipe boolean primer dengan kelas Boolean ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ). kelas tidak menggunakan konvensi huruf besar
IvoC
24

Seperti yang telah dinyatakan, instance enum harus ditulis dalam huruf besar sesuai dengan dokumen di situs web Oracle ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ).

Namun, ketika melihat tutorial JavaEE7 di situs web Oracle ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ), saya menemukan tutorial "Duke's bookstore" dan di kelas ( tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), Saya menemukan definisi enum berikut:

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

Menurut konvensi, seharusnya terlihat seperti:

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;
    }
}

Jadi sepertinya bahkan orang-orang di Oracle terkadang berdagang dengan nyaman.

beosign
sumber
13

Dalam basis kode kami; kami biasanya mendeklarasikan enum di kelas tempat mereka berasal.

Jadi untuk contoh Buah Anda, Kami akan memiliki kelas Buah, dan di dalamnya ada Enum yang disebut Buah.

Merujuknya dalam kode terlihat seperti ini Fruit.Fruits.Apple, Fruit.Fruits.Pear:, dll.

Konstanta mengikuti garis yang sama, di mana mereka didefinisikan dalam kelas yang relevan (jadi sesuatu seperti Fruit.ORANGE_BUSHEL_SIZE); atau jika mereka menerapkan seluruh sistem (yaitu "nilai nol" yang setara untuk int) dalam kelas bernama "ConstantManager" (atau setara; seperti ConstantManager.NULL_INT). (catatan; semua konstanta kami dalam huruf besar)

Seperti biasa, standar pengkodean Anda mungkin berbeda dari standar saya; jadi YMMV.

Jim B
sumber
5
Saya ingin menambahkan bahwa sepertinya pabrik objek saat ini dinamai menggunakan bentuk jamak, misalnya Listsdan Maps. Menurut saya ini adalah konvensi yang bagus dan saya sepenuhnya mendukung penggunaannya yang lebih luas.
Esko
Ya, mereka mirip dengan standar pengkodean pribadi saya, tetapi berbeda dengan standar pengkodean tempat kerja saya. Kami tidak memiliki banyak standar untuk bekerja, jadi saya mencoba mencari dokumen yang baik untuk digunakan sebagai referensi.
8
Fruit.Fruits.Appleterlalu bertele-tele bagi saya, benar-benar melanggar prinsip KERING :-) Saya lebih suka misalnya Fruit.Type.APPLE.
Péter Török
2
Saya tidak suka pendekatan ini. Cara ini dinamai, Apple baik adalah-Buah, atau setidaknya membingungkan karena tidak jelas bahwa Apple adalah-bukan-Buah. Saya suka contoh Tipe Peter. Setidaknya dengan sendirinya mendokumentasikan bahwa APPLE adalah jenis buah. Meskipun contoh buah utuh ini berbau busuk ...
Mark Peters
1
Saya juga tidak suka ini. Jika kelas 'Buah' mewakili buah (dan seharusnya) maka apa yang bisa mewakili 'Buah'? Jika Fruit (kelas) benar-benar kelas untuk berurusan dengan Fruit maka itu harus diganti namanya "FruitHandler 'atau' FruitManager '.
DJClayworth
7

Mereka masih tipe, jadi saya selalu menggunakan konvensi penamaan yang sama saya gunakan untuk kelas.

Saya pasti akan mengerutkan kening pada menempatkan "Kelas" atau "Enum" dalam nama. Jika Anda memiliki a FruitClassdan a FruitEnummaka ada sesuatu yang salah dan Anda perlu lebih banyak nama deskriptif. Saya mencoba untuk berpikir tentang jenis kode yang akan membutuhkan keduanya, dan sepertinya harus ada Fruitkelas dasar dengan subtipe alih-alih enum. (Itu hanya spekulasi saya sendiri, Anda mungkin memiliki situasi yang berbeda dari yang saya bayangkan.)

Referensi terbaik yang dapat saya temukan untuk penamaan konstanta berasal dari tutorial Variables :

Jika nama yang Anda pilih hanya terdiri dari satu kata, eja kata itu dalam semua huruf kecil. Jika terdiri dari lebih dari satu kata, kapitalkan huruf pertama dari setiap kata berikutnya. Nama gearRatio dan currentGear adalah contoh utama dari konvensi ini. Jika variabel Anda menyimpan nilai konstan, seperti int akhir statis NUM_GEARS = 6, konvensi berubah sedikit, huruf besar setiap huruf dan pisahkan kata-kata selanjutnya dengan karakter garis bawah. Dengan konvensi, karakter garis bawah tidak pernah digunakan di tempat lain.

Bill the Lizard
sumber
Referensi untuk konstanta penamaan ada di oracle.com/technetwork/java/javase/documentation/…
Christoffer Hammarström
1

Jika saya dapat menambahkan $ 0,02, saya lebih suka menggunakan PascalCase sebagai nilai enum dalam C.

Di C, mereka pada dasarnya global, dan PEER_CONNECTED menjadi sangat melelahkan dibandingkan dengan PeerConnected.

Napas udara segar.

Secara harfiah, itu membuat saya bernapas lebih mudah.

Di Jawa, dimungkinkan untuk menggunakan nama enum mentah selama Anda statis mengimpornya dari kelas lain.

import static pkg.EnumClass.*;

Sekarang, Anda dapat menggunakan nama yang tidak memenuhi syarat, yang sudah Anda kualifikasi dengan cara yang berbeda.

Saat ini saya (berpikir) tentang porting beberapa kode C ke Jawa dan saat ini 'sobek' antara memilih konvensi Java (yang lebih verbose, lebih panjang, dan lebih jelek) dan gaya C saya.

PeerConnected akan menjadi PeerState.CONNECTED kecuali dalam pernyataan switch, di mana ia TERHUBUNG.

Sekarang ada banyak yang bisa dikatakan untuk konvensi terakhir dan itu memang terlihat bagus tetapi "frase idiomatik" tertentu seperti if (s == PeerAvailable)menjadi sepertiif (s == PeerState.AVAILABLE) dan nostalgia, ini adalah kehilangan makna bagi saya.

Saya pikir saya masih lebih suka gaya Java karena kejelasan tapi saya kesulitan melihat kode berteriak.

Sekarang saya menyadari PascalCase sudah banyak digunakan di Jawa tetapi sangat membingungkan itu tidak akan benar-benar, hanya sedikit keluar dari tempatnya.

Xennex81
sumber
0
enum MyEnum {VALUE_1,VALUE_2}

adalah (kurang-lebih) seperti mengatakan

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 }
}

jadi saya kira semua topi benar-benar lebih benar, tetapi saya masih menggunakan konvensi nama kelas karena saya benci semua topi di mana pun

Damian kober
sumber