ข้อกำหนดการเข้ารหัส - การตั้งชื่อ Enums


289

มีแบบแผนสำหรับการตั้งชื่อ enumerations ใน Java หรือไม่?

การตั้งค่าของฉันคือ enum เป็นประเภท ตัวอย่างเช่นคุณมี enum

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

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

ฉันไม่เห็นด้วยกับการตั้งชื่อ:

FruitEnum
NetworkConnectionTypeEnum

ฉันเข้าใจว่ามันง่ายที่จะเลือกไฟล์ที่ enums แต่คุณจะต้อง:

NetworkConnectionClass
FruitClass

นอกจากนี้ยังมีเอกสารที่ดีที่อธิบายเช่นเดียวกันสำหรับค่าคงที่ที่จะประกาศ ฯลฯ ?


2
กรุณาทำให้มันเป็นชุมชนวิกิ เนื่องจากไม่มีคำตอบเดียวที่ยอมรับได้และมันจะถูกปิดเป็นอย่างอื่น
Alexander Pogrebnyak

13
@Alexander Pogrebnyak ไม่มีคำตอบอยู่
Tom Hawtin - tackline

คำตอบ:


473

Enums เป็นชั้นเรียนและควรปฏิบัติตามอนุสัญญาสำหรับชั้นเรียน อินสแตนซ์ของ enum เป็นค่าคงที่และควรปฏิบัติตามอนุสัญญาสำหรับค่าคงที่ ดังนั้น

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

ไม่มีเหตุผลในการเขียน FruitEnum มากกว่า FruitClass คุณกำลังสูญเสียอักขระสี่ตัว (หรือห้าตัว) ที่ไม่เพิ่มข้อมูลใด ๆ

Java ตัวเองแนะนำวิธีการนี้และจะมีการใช้ในตัวอย่างของพวกเขา


22
ฉันเริ่มตั้งชื่อ enums ของฉันด้วยวิธีนี้ แต่เพื่อความสะดวกในการอ่านฉันได้ใช้ Fruit.Apple แทน Fruit.APPLE

38
@Walter ทำไมการทำให้ตัวอย่าง enum ดูเหมือนว่าเป็นคลาสที่ปรับปรุงการอ่าน?
DJClayworth

17
ในทางเทคนิคอินสแตนซ์ enum เป็นคลาส นั่นเป็นเหตุผลที่พวกเขาสามารถมีวิธีการ
Ted Hopp

87
ไม่อินสแตนซ์ enum เป็นอินสแตนซ์ Enum เป็นคลาส
DJClayworth

30
แนวคิดของรูปแบบการตั้งชื่อที่ทำให้ฉันพิมพ์ Fruit.APPLE.chew () ทำให้ฉันเป็นโรคจิตจริงๆ นอกจากนี้แม้ว่ามันจะเป็นการปฏิบัติที่เลวร้ายมาก แต่แอปเปิ้ลไม่จำเป็นต้องเป็นค่าคงที่ (ไม่เปลี่ยนรูป) ด้วยการส่งเสริม enums ให้กับคลาสจาวาเต็มรูปแบบฉันไม่แน่ใจว่าจะใช้การประชุมที่พัฒนาขึ้นสำหรับบางสิ่งที่ไม่ได้มีอยู่ใน c (Objects ไม่ใช่ enums) เข้าท่าเสมอ
Bill K

76

นี่อาจจะไม่ทำให้ฉันมีเพื่อนใหม่จำนวนมาก แต่ควรเพิ่มว่าคน C # มีแนวทางที่แตกต่าง: กรณี enum คือ "กรณี Pascal" (ตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็ก) ดูการอภิปราย StackOverflowและMSDN ประเภทการแจงนับหลักเกณฑ์การตั้งชื่อ

ในขณะที่เรากำลังแลกเปลี่ยนข้อมูลกับระบบ C # ฉันถูกล่อลวงให้คัดลอก enums ของพวกเขาโดยไม่สนใจ "ค่าคงที่มีชื่อตัวพิมพ์ใหญ่ของ Java" เมื่อพิจารณาถึงเรื่องนี้ฉันไม่เห็นคุณค่ามากนักที่ถูก จำกัด ให้ใช้ตัวพิมพ์ใหญ่สำหรับกรณี enum สำหรับวัตถุประสงค์บางอย่าง. name () เป็นทางลัดที่สะดวกในการรับค่าคงที่ enum ที่อ่านได้และชื่อเคสแบบผสมจะดูดีกว่า

ดังนั้นใช่ฉันกล้าตั้งคำถามเกี่ยวกับหลักการตั้งชื่อ Java enum ความจริงที่ว่า "อีกครึ่งหนึ่งของโลกแห่งการเขียนโปรแกรม" ใช้สไตล์ที่แตกต่างทำให้ฉันคิดว่ามันถูกกฎหมายที่จะสงสัยในศาสนาของเรา


7
TILที่มีเพียงโปรแกรมเมอร์ Java หรือ C # เท่านั้นที่เป็นโปรแกรมเมอร์จริงและมีจำนวนเท่ากัน #sarcasm
Mindwin

14
C # เป็นภาษาที่ยอดเยี่ยม แต่นี่เป็นเพียงความงี่เง่าธรรมดา ทุกอย่างเป็นปาสกาลใน C # ซึ่งโดยทั่วไปเหมือนกับไม่มีการตั้งชื่อการประชุมเลย คุณไม่ได้อะไรจากการดูชื่อ คุณไม่สามารถบอกได้ว่ามันเป็นคลาสวิธีการทรัพย์สิน ฯลฯ
Bassinator

3
นอกจากนี้บูลีนเป็นจริง enum, อินสแตนซ์ที่เป็นจริงและเท็จในตัวพิมพ์เล็ก ดังนั้นใช่หมวกทั้งหมดน่าเกลียด
Florian F

@FlorianF อย่าสับสนประเภทบูลีนหลักกับคลาสบูลีน ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ) ชั้นจะใช้การประชุมตัวพิมพ์ใหญ่
IvoC

24

ตามที่ระบุไว้แล้วอินสแตนซ์ enum ควรเป็นตัวพิมพ์ใหญ่ตามเอกสารบนเว็บไซต์ Oracle ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html )

อย่างไรก็ตามในขณะที่มองผ่านบทช่วยสอน JavaEE7 บนเว็บไซต์ของออราเคิล ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ) ฉันก็สะดุดกับการกวดวิชา "ร้านหนังสือของ Duke" และในชั้นเรียน ( tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java) ฉันพบนิยาม enum ต่อไปนี้:

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

ใน codebase ของเรา เรามักจะประกาศ enums ในชั้นเรียนที่พวกเขาอยู่

ดังนั้นสำหรับตัวอย่างผลไม้ของคุณเราจะมีคลาสผลไม้และภายในนั้น Enum ที่เรียกว่าผลไม้

การอ้างอิงในโค้ดจะมีลักษณะดังนี้: Fruit.Fruits.Apple, Fruit.Fruits.Pearเป็นต้น

ค่าคงที่จะตามมาในบรรทัดเดียวกันโดยที่พวกมันจะถูกกำหนดในคลาสที่พวกมันเกี่ยวข้องกัน (อย่างนั้นFruit.ORANGE_BUSHEL_SIZE) หรือถ้าพวกเขาใช้ทั้งระบบ (เช่นเทียบเท่า "ค่า null" สำหรับ ints) ในคลาสที่ชื่อว่า "ConstantManager" (หรือเทียบเท่า; เช่นConstantManager.NULL_INT) (หมายเหตุด้านข้างค่าคงที่ของเราทั้งหมดเป็นตัวใหญ่)

เช่นเคยมาตรฐานการเข้ารหัสของคุณอาจแตกต่างจากของฉัน ดังนั้น YMMV


5
ฉันต้องการเพิ่มว่ามันดูเหมือนว่าโรงงานวัตถุที่มีชื่อในปัจจุบันโดยใช้รูปพหูพจน์เช่นและLists Mapsในความเห็นของฉันนี่เป็นแบบแผนที่ดีและฉันสนับสนุนการใช้อย่างแพร่หลายมากขึ้น
Esko

ใช่พวกเขาคล้ายกับมาตรฐานการเข้ารหัสส่วนตัวของฉัน แต่แตกต่างจากมาตรฐานการเข้ารหัสในที่ทำงานของฉัน เรามีมาตรฐานไม่มากสำหรับการทำงานดังนั้นฉันจึงพยายามหาเอกสารที่ดีเพื่อใช้เป็นข้อมูลอ้างอิง

8
Fruit.Fruits.Appleเกินไป verbose กับผมอย่างแท้จริงที่จะหมดหลักการแห้ง :-) Fruit.Type.APPLEฉันชอบเช่น
PéterTörök

2
ฉันไม่ชอบวิธีการนี้ วิธีนี้มีชื่อแอปเปิ้ลเป็นผลไม้หรืออย่างน้อยก็สับสนเพราะไม่ชัดเจนว่าแอปเปิ้ลไม่ได้เป็นผลไม้ ฉันชอบตัวอย่างประเภทของปีเตอร์ อย่างน้อยก็เป็นเอกสารด้วยตนเองที่ APPLE เป็นผลไม้ประเภทหนึ่ง แม้ว่าตัวอย่างผลไม้ทั้งหมดนี้จะมีกลิ่นเหม็นเน่า ...
Mark Peters

1
ฉันไม่ชอบสิ่งนี้ หากคลาส 'Fruit' แสดงถึงผลไม้ (และควร) แล้ว 'Fruit' จะเป็นตัวแทนของอะไรได้บ้าง ถ้า Fruit (คลาส) เป็นคลาสสำหรับจัดการกับ Fruit คุณควรเปลี่ยนชื่อเป็น "FruitHandler 'หรือ' FruitManager '
DJClayworth

7

พวกมันยังคงเป็นประเภทดังนั้นฉันมักจะใช้ข้อตกลงการตั้งชื่อแบบเดียวกันกับที่ใช้กับคลาส

ฉันจะขมวดคิ้วอย่างแน่นอนเมื่อใส่ "Class" หรือ "Enum" ในชื่อ หากคุณมีทั้ง a FruitClassและ a FruitEnumอย่างอื่นนั้นผิดและคุณต้องการชื่อที่อธิบายเพิ่มเติม ฉันพยายามคิดเกี่ยวกับประเภทของรหัสที่จะนำไปสู่ความต้องการทั้งสองและดูเหมือนว่าควรมีFruitคลาสฐานที่มีชนิดย่อยแทนที่จะเป็น enum (นั่นเป็นเพียงการเก็งกำไรของฉันเอง แต่คุณอาจมีสถานการณ์ที่แตกต่างจากสิ่งที่ฉันจินตนาการ)

การอ้างอิงที่ดีที่สุดที่ฉันสามารถหาค่าคงที่การตั้งชื่อมาจากการสอนตัวแปร :

หากชื่อที่คุณเลือกประกอบด้วยเพียงหนึ่งคำให้สะกดคำนั้นด้วยตัวอักษรตัวพิมพ์เล็กทั้งหมด หากประกอบด้วยมากกว่าหนึ่งคำให้ใช้ตัวอักษรตัวแรกของคำต่อ ๆ ไปเป็นตัวพิมพ์ใหญ่ ชื่อ gearRatio และ currentGear เป็นตัวอย่างสำคัญของการประชุมนี้ หากตัวแปรของคุณเก็บค่าคงที่เช่นคงที่ int สุดท้าย NUM_GEARS = 6 การประชุมจะเปลี่ยนไปเล็กน้อยโดยใช้อักษรตัวใหญ่ทุกตัวและแยกคำที่ตามมาด้วยตัวอักษรขีดล่าง โดยการประชุมตัวอักษรขีดล่างจะไม่เคยใช้ที่อื่น


การอ้างอิงสำหรับการตั้งชื่อค่าคงที่อยู่ที่oracle.com/technetwork/java/javase/documentation/ …
Christoffer Hammarström

1

ถ้าฉันสามารถเพิ่ม $ 0.02 ของฉันฉันชอบใช้ PascalCase เป็นค่า enum ใน C

ใน C พวกเขาเป็นโลกโดยทั่วไปและ PEER_CONNECTED นั้นเหนื่อยมากเมื่อเทียบกับ PeerConnected

สูดอากาศบริสุทธิ์

แท้จริงแล้วมันทำให้ฉันหายใจง่ายขึ้น

ใน Java เป็นไปได้ที่จะใช้ชื่อ raw enum ตราบใดที่คุณคงนำเข้าจากคลาสอื่น

import static pkg.EnumClass.*;

ตอนนี้คุณสามารถใช้ชื่อที่ไม่มีเงื่อนไขซึ่งคุณผ่านการรับรองในวิธีที่ต่างออกไปแล้ว

ขณะนี้ฉันกำลังคิดเกี่ยวกับการย้ายรหัส C ไปยัง Java และขณะนี้ 'ขาด' ระหว่างการเลือกการประชุม Java (ซึ่งมีความละเอียดมากกว่ายาวกว่าและน่าเกลียดกว่า) และสไตล์ C ของฉัน

PeerConnected จะกลายเป็น PeerState.CONNECTED ยกเว้นในคำสั่ง switch ที่มีการเชื่อมต่อ

ตอนนี้มีหลายสิ่งที่จะพูดสำหรับการประชุมครั้งหลังและมันก็ดูดี แต่บางวลี "สำนวน" เช่นif (s == PeerAvailable)กลายเป็นเหมือนif (s == PeerState.AVAILABLE)และคิดถึงนี่คือการสูญเสียความหมายกับฉัน

ฉันคิดว่าฉันยังคงชอบสไตล์ Java เพราะความชัดเจน แต่ฉันมีเวลายากที่จะดูรหัสกรีดร้อง

ตอนนี้ฉันรู้ว่า PascalCase ใช้กันอย่างแพร่หลายใน Java แต่สับสนมากว่ามันจะไม่เป็นจริงเพียงแค่ตาดออกจากสถานที่


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

ดังนั้นฉันเดาว่าตัวพิมพ์ใหญ่ทั้งหมดถูกต้องมากขึ้นอย่างเข้มงวด แต่ฉันยังคงใช้การประชุมชื่อคลาสเนื่องจากฉันเกลียดตัวพิมพ์ใหญ่ทั้งหมดไม่ว่าที่ไหน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.