Quy ước mã hóa - Đặt tên Enums


289

Có một quy ước để đặt tên liệt kê trong Java không?

Sở thích của tôi là enum là một loại. Vì vậy, ví dụ, bạn có một enum

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

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

Tôi phản đối việc đặt tên cho nó:

FruitEnum
NetworkConnectionTypeEnum

Tôi hiểu rằng thật dễ dàng để chọn ra những tập tin nào là enum, nhưng sau đó bạn cũng sẽ có:

NetworkConnectionClass
FruitClass

Ngoài ra, có một tài liệu tốt mô tả tương tự cho các hằng số, nơi khai báo chúng, v.v.?


2
Hãy biến nó thành một Wiki cộng đồng. Vì không có câu trả lời duy nhất có thể chấp nhận được, và nó sẽ bị đóng lại nếu không.
Alexander Pogrebnyak

13
@Alexander Pogrebnyak Không, có câu trả lời.
Tom Hawtin - tackline

Câu trả lời:


473

Enums là các lớp và nên tuân theo các quy ước cho các lớp. Thể hiện của một enum là hằng số và nên tuân theo các quy ước cho hằng số. Vì thế

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

Không có lý do để viết FruitEnum nhiều hơn FruitClass. Bạn chỉ lãng phí bốn (hoặc năm) ký tự mà không thêm thông tin.

Bản thân Java khuyến nghị cách tiếp cận này và nó được sử dụng trong các ví dụ của họ .


22
Tôi đã bắt đầu đặt tên cho enum của mình theo cách đó, nhưng để dễ đọc, giờ tôi đã sử dụng Fruit.Apple thay vì Fruit.APPLE.

38
@Walter Tại sao làm cho một ví dụ enum trông giống như nó là một lớp nâng cao khả năng đọc?
DJClayworth

17
Về mặt kỹ thuật, enum các lớp. Đó là lý do tại sao họ có thể có phương pháp.
Ted Hopp

87
Không, một ví dụ enum là một ví dụ. Một enum là một lớp học.
DJClayworth

30
Ý tưởng về một mẫu đặt tên khiến tôi gõ Fruit.APPLE.chew () thực sự làm tôi khó chịu. Ngoài ra, mặc dù nó sẽ là một thực tiễn rất xấu, APPLE không phải là một hằng số (bất biến). Với việc quảng cáo enum cho các lớp java đầy đủ, tôi không chắc chắn sử dụng các quy ước được phát triển cho một thứ thậm chí không tồn tại trong c (Đối tượng, không phải enum) luôn có ý nghĩa
Bill K

76

Điều này có thể sẽ không làm cho tôi có nhiều bạn mới, nhưng cần nói thêm rằng người C # có một hướng dẫn khác: Các trường hợp enum là "trường hợp Pascal" (chữ hoa / chữ thường được trộn lẫn). Xem thảo luận về stackoverflowNguyên tắc đặt tên kiểu liệt kê MSDN .

Khi chúng tôi đang trao đổi dữ liệu với một hệ thống C #, tôi rất muốn sao chép chính xác các enum của chúng, bỏ qua quy ước "hằng có tên viết hoa" của Java. Nghĩ về nó, tôi không thấy nhiều giá trị khi bị giới hạn viết hoa cho các trường hợp enum. Đối với một số mục đích .name () là một phím tắt tiện dụng để có được biểu diễn có thể đọc được của hằng số enum và tên trường hợp hỗn hợp sẽ trông đẹp hơn.

Vì vậy, vâng, tôi dám đặt câu hỏi về giá trị của quy ước đặt tên enum Java. Việc "nửa kia của thế giới lập trình" thực sự sử dụng một phong cách khác khiến tôi nghĩ rằng việc nghi ngờ tôn giáo của chính chúng ta là hợp pháp.


7
TIL rằng chỉ có lập trình viên Java hoặc C # là lập trình viên thực sự và số lượng của họ bằng nhau. #sarcasm
Mindwin

14
C # là một ngôn ngữ tuyệt vời khác, nhưng điều này chỉ đơn giản là ngớ ngẩn. Mọi thứ đều có khá nhiều trường hợp pascal trong C #, về cơ bản giống như không có quy ước đặt tên nào cả; bạn không đạt được gì khi nhìn vào một cái tên. Bạn không thể biết đó có phải là một lớp học, phương thức, thuộc tính, v.v.
Bassinator

3
Ngoài ra, boolean thực tế là một enum, các trường hợp là đúng và sai, viết thường. Vì vậy, có, tất cả các mũ là xấu xí.
Florian F

@FlorianF, đừng nhầm lẫn loại boolean chính với lớp Boolean ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ). lớp học sử dụng quy ước viết hoa
IvoC

24

Như đã nêu, các trường hợp enum nên viết hoa theo các tài liệu trên trang web của Oracle ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ).

Tuy nhiên, trong khi xem qua hướng dẫn JavaEE7 trên trang web của Oracle ( http://www.oracle.com/technetwork/java/javaee/doads/index.html ), tôi tình cờ thấy hướng dẫn "hiệu sách của Duke" và trong một lớp học ( tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), Tôi tìm thấy định nghĩa enum sau đây:

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

Theo các công ước, nó đáng lẽ phải trông giống như:

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

Vì vậy, có vẻ như ngay cả những người ở Oracle đôi khi giao dịch thuận tiện.


13

Trong cơ sở mã của chúng tôi; chúng tôi thường khai báo enum trong lớp mà chúng thuộc về.

Vì vậy, với ví dụ về Trái cây của bạn, chúng tôi sẽ có một lớp Trái cây và bên trong đó là một Enum gọi là Trái cây.

Tham chiếu nó trong mã trông như thế này : Fruit.Fruits.Apple, Fruit.Fruits.Pear, v.v.

Các hằng số theo cùng một dòng, trong đó chúng được định nghĩa trong lớp mà chúng có liên quan (tương tự như vậy Fruit.ORANGE_BUSHEL_SIZE); hoặc nếu họ áp dụng toàn hệ thống (nghĩa là "giá trị null" tương đương cho ints) trong một lớp có tên "ConstantManager" (hoặc tương đương; như ConstantManager.NULL_INT). (lưu ý bên; tất cả các hằng số của chúng tôi đều viết hoa)

Như mọi khi, tiêu chuẩn mã hóa của bạn có thể khác với tôi; YMMV cũng vậy.


5
Tôi muốn thêm rằng có vẻ như các nhà máy đối tượng ngày nay được đặt tên bằng cách sử dụng số nhiều, ví dụ ListsMaps. Theo tôi đây là một quy ước tốt và tôi hoàn toàn ủng hộ việc sử dụng rộng rãi hơn của nó.
Esko

Vâng, chúng tương tự như tiêu chuẩn mã hóa cá nhân của tôi, nhưng khác với tiêu chuẩn mã hóa nơi làm việc của tôi. Chúng tôi không có nhiều tiêu chuẩn phù hợp cho công việc, vì vậy tôi đang cố gắng tìm một tài liệu tốt để sử dụng làm tài liệu tham khảo.

8
Fruit.Fruits.Applequá dài dòng đối với tôi, theo nghĩa đen là phá vỡ nguyên tắc DRY :-) Tôi thích ví dụ Fruit.Type.APPLE.
Péter Török

2
Tôi không thích cách tiếp cận này. Cách đặt tên này, Apple cũng là - Trái cây hoặc ít nhất là khó hiểu vì không rõ Apple không phải là Trái cây. Tôi thích ví dụ Loại của Peter. Ít nhất thì nó cũng tự chứng minh rằng APPLE là - một loại trái cây. Mặc dù toàn bộ ví dụ trái cây này có mùi thối ...
Mark Peters

1
Tôi cũng không thích điều này. Nếu lớp 'Trái cây' đại diện cho một loại trái cây (và nó nên) thì 'Trái cây' có thể đại diện cho cái gì? Nếu Fruit (lớp) thực sự là một lớp để đối phó với Fruit thì nó nên được đổi tên thành "FruitHandler 'hoặc' FruitManager '.
DJClayworth

7

Chúng vẫn là các loại, vì vậy tôi luôn sử dụng các quy ước đặt tên giống như tôi sử dụng cho các lớp.

Tôi chắc chắn sẽ cau mày khi đặt "Class" hoặc "Enum" vào một cái tên. Nếu bạn có cả a FruitClassvà a FruitEnumthì một cái gì đó khác là sai và bạn cần tên mô tả nhiều hơn. Tôi đang cố gắng nghĩ về loại mã sẽ dẫn đến cần cả hai, và có vẻ như nên có một Fruitlớp cơ sở với các kiểu con thay vì enum. (Đó chỉ là suy đoán của riêng tôi, bạn có thể có một tình huống khác với những gì tôi đang tưởng tượng.)

Tài liệu tham khảo tốt nhất mà tôi có thể tìm thấy để đặt tên các hằng số đến từ hướng dẫn Biến :

Nếu tên bạn chọn chỉ bao gồm một từ, hãy đánh vần từ đó trong tất cả các chữ cái viết thường. Nếu nó bao gồm nhiều hơn một từ, viết hoa chữ cái đầu tiên của mỗi từ tiếp theo. Tên gearRatio và currentGear là ví dụ điển hình của quy ước này. Nếu biến của bạn lưu trữ một giá trị không đổi, chẳng hạn như static int int NUM_GEARS = 6, quy ước sẽ thay đổi một chút, viết hoa mỗi chữ cái và tách các từ tiếp theo bằng ký tự gạch dưới. Theo quy ước, ký tự gạch dưới không bao giờ được sử dụng ở nơi khác.


Tài liệu tham khảo cho việc đặt tên các hằng số là tại oracle.com/technetwork/java/javase/documentation/ mẹo
Christoffer Hammarström

1

Nếu tôi có thể thêm 0,02 đô la của mình, tôi thích sử dụng PascalCase làm giá trị enum trong C.

Trong C, về cơ bản chúng là toàn cầu và PEER_CONNECTED thực sự mệt mỏi so với PeerConnected.

Hơi thở của không khí trong lành.

Theo nghĩa đen, nó làm cho tôi thở dễ dàng hơn.

Trong Java, có thể sử dụng tên enum thô miễn là bạn nhập chúng từ một lớp khác.

import static pkg.EnumClass.*;

Bây giờ, bạn có thể sử dụng các tên không đủ tiêu chuẩn, mà bạn đủ điều kiện theo một cách khác.

Tôi hiện đang (suy nghĩ) về việc chuyển một số mã C sang Java và hiện đang 'rách nát' giữa việc chọn quy ước Java (dài dòng hơn, dài hơn và xấu hơn) và kiểu C của tôi.

PeerConnected sẽ trở thành PeerState.CONNECTED ngoại trừ trong các câu lệnh chuyển đổi, trong đó nó được KẾT NỐI.

Bây giờ có nhiều điều để nói cho quy ước sau và nó trông có vẻ hay nhưng một số "cụm từ thành ngữ" nhất định như if (s == PeerAvailable)trở nên giống như if (s == PeerState.AVAILABLE)và hoài cổ, đây là một sự mất ý nghĩa đối với tôi.

Tôi nghĩ rằng tôi vẫn thích phong cách Java vì sự rõ ràng nhưng tôi có một thời gian khó khăn khi nhìn vào mã la hét.

Bây giờ tôi nhận ra PascalCase đã được sử dụng rộng rãi trong Java nhưng rất khó hiểu nó sẽ không thực sự tồn tại, chỉ là một chút lạc lõng.


0
enum MyEnum {VALUE_1,VALUE_2}

là (khoảng) như nói

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

vì vậy tôi đoán tất cả các mũ đều đúng hơn, nhưng tôi vẫn sử dụng quy ước tên lớp vì tôi ghét tất cả các mũ ở bất cứ đâu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.