การตั้งชื่อของ enums ใน Java: เอกพจน์หรือพหูพจน์?


184

มีคำแนะนำ "อย่างเป็นทางการ" ของวิธีตั้งชื่อ enums Java หรือไม่

enum Protocol { HTTP, HTTPS, FTP }

หรือ

enum Protocols { HTTP, HTTPS, FTP }

ฉันรู้ว่าในโลกของ. Net คำแนะนำคือการใช้เอกพจน์ยกเว้นสำหรับ enums ที่เป็นตัวแทนของธงบิต แค่สงสัยว่ามีอะไรที่คล้ายกันใน Java

คำถามที่เกี่ยวข้องที่ดูเหมือนจะเป็น. เฉพาะสุทธิ: เอกพจน์หรือพหูพจน์สำหรับการแจกแจง?


3
คุณสามารถหาคำตอบได้ที่นี่ Enums เป็นคลาสซึ่งหมายความว่าคุณควรประกาศด้วยวิธีเดียวกัน
bsiamionau

คำตอบ:


220

Enums ใน Java (และอาจเป็น enums โดยทั่วไป) ควรเป็นเอกพจน์ ความคิดคือคุณไม่ได้เลือกหลายโปรโตคอล แต่เป็นเพียงหนึ่งโปรโตคอลของตัวเลือกที่เป็นไปได้ในรายการค่า

สังเกตว่าไม่มีพหูพจน์: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html


2
Microsoft ดูเหมือนว่าจะมีความคิดเห็นแบบเดียวกันเกี่ยวกับการเขียนโปรแกรม. NET: stackoverflow.com/a/1336012/279112
Panzercrisis

ทำไมTimeUnit ถึงใช้คำพหูพจน์ เช่น: DAYS, HOURS...
themuv

4
ค่าที่เป็นพหูพจน์ enum ตัวเองไม่ได้ :-)
คาลวิน

21

ในทำนองเดียวกันเมื่อคุณกำหนดชื่อตารางในฐานข้อมูลหรือคลาสใน Java คุณใช้เอกพจน์สำหรับ enums ก็เป็นตัวเลือกที่ดีที่สุด ดูว่าคุณจะใช้มันอย่างไร

ลองเขียนตัวอย่าง:

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

class Appointment {
private Day day;

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

ในรูปแบบเอกพจน์คุณจะเห็นชัดเจนถึงความตั้งใจของแอตทริบิวต์วัน "วัน" เป็นวันของสัปดาห์ที่จะมีการนัดหมายนี้ มิฉะนั้นลายเซ็นของวิธีการจะถูกกำหนดวัน (วันวัน) และแน่นอนว่าผู้คนจำนวนมากจะสงสัยว่าการนัดหมายอาจเกิดขึ้นในมากกว่าหนึ่งวัน

หากคุณทำงานใน บริษัท มีกะ 48 ชั่วโมงคุณสามารถลองกำหนดสิ่งต่อไปนี้:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

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

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

ตอนนี้คุณกำลังแสดงความหมายของ enum จริงๆ โดยปกติในโดเมนใด ๆ ที่คุณจะพบว่าการใช้เอกพจน์สำหรับ enum เป็นตัวเลือกที่ดีที่สุดเนื่องจากค่าคงที่ใน enum เป็นเพียงองค์ประกอบเดียว

คุณยังพูดถึง. NET "ค่าสถานะ" enum ใน. 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 แต่ Enum ยังคงเป็นเอกพจน์:

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 ก็คือการใช้ List


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