코딩 규칙-명명 열거 형


289

Java에서 열거의 이름을 지정하는 규칙이 있습니까?

선호하는 것은 열거 형이 유형입니다. 예를 들어 enum이 있습니다.

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

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

나는 그것을 명명하는 것에 반대한다.

FruitEnum
NetworkConnectionTypeEnum

열거 형 파일을 선택하는 것이 쉽지만 다음과 같은 이점도 있습니다.

NetworkConnectionClass
FruitClass

또한 상수, 선언 위치 등을 설명하는 좋은 문서가 있습니까?


2
커뮤니티 위키로 만드십시오. 수용 가능한 단일 답변이 없으므로 그렇지 않으면 닫힙니다.
Alexander Pogrebnyak

13
@Alexander Pogrebnyak 아니요, 답이 있습니다.
Tom Hawtin-tackline

답변:


473

열거 형은 클래스이며 클래스의 규칙을 따라야합니다. 열거 형의 인스턴스는 상수이며 상수에 대한 규칙을 따라야합니다. 그래서

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

FruitClass보다 FruitEnum을 작성할 이유가 없습니다. 정보를 추가하지 않는 4 ~ 5 개의 문자 만 낭비하고 있습니다.

Java 자체는이 접근법을 권장 하며 예제에서 사용됩니다 .


22
나는 그런 식으로 열거 형의 이름을 지정하기 시작했지만 가독성을 위해 이제 Fruit.APPLE 대신 Fruit.Apple을 사용하고 있습니다.

38
@Walter 열거 형 인스턴스를 클래스처럼 보이게 만드는 이유는 무엇입니까?
DJClayworth

17
기술적으로 열거 형 인스턴스 클래스입니다. 그것이 그들이 방법을 가질 수있는 이유입니다.
Ted Hopp

87
아니요, 열거 형 인스턴스는 인스턴스입니다. 열거 형은 클래스입니다.
DJClayworth

30
나를 Fruit.APPLE.chew () 형식으로 만드는 명명 패턴에 대한 아이디어는 실제로 버그가 있습니다. 또한 매우 나쁜 습관이지만 APPLE은 상수 (불변) 일 필요는 없습니다. 완전한 자바 클래스로 열거 형을 홍보하면서 c에도 존재하지 않는 객체 (열거 형이 아닌 객체)를 위해 개발 된 규칙을 사용하는 것이 확실하지 않습니다.
Bill K

76

이것은 아마도 많은 새로운 친구를 만들지는 않지만 C # 사람들은 다른 지침을 가지고 있어야한다고 덧붙여 야합니다. 열거 형 인스턴스는 "파스칼 케이스"입니다 (대 / 소문자 혼합). stackoverflow 토론MSDN 열거 유형 명명 지침을 참조하십시오 .

C # 시스템과 데이터를 교환 할 때 Java의 "constants has 대문자 이름"규칙을 무시하고 열거 형을 정확하게 복사하려고합니다. 그것에 대해 생각하면 열거 형 인스턴스의 대문자로 제한되는 데 큰 가치가 없습니다. 일부 목적으로 .name ()은 열거 형 상수의 읽기 쉬운 표현을 얻는 편리한 바로 가기이며 대소 문자가 혼합 된 이름이 더 좋아 보입니다.

따라서 Java enum 명명 규칙의 가치에 대해 의문의 여지가 있습니다. "프로그래밍 세계의 다른 절반"이 실제로 다른 스타일을 사용한다는 사실은 우리 자신의 종교를 의심하는 것이 합법적이라고 생각합니다.


7
TIL은 단지 자바 나 C # 프로그래머는 실제 프로그래머 것을, 그들의 숫자는 동일하다고. #sarcasm
Mindwin

14
C #은 그렇지 않은 훌륭한 언어이지만 이것은 단순한 바보입니다. C #에서는 모든 것이 파스칼 사례이며, 기본적으로 명명 규칙이 전혀없는 것과 같습니다. 이름을 보면 아무것도 얻지 못합니다. 그것이 클래스, 메소드, 속성 등인지 알 수 없습니다.
Bassinator

3
또한 부울은 실제로 열거 형이며 인스턴스는 소문자로 true와 false입니다. 네, 모든 모자는 못 생겼습니다.
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 ) 의 문서에 따라 대문자 여야합니다 .

그러나 Oracle 웹 사이트 ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html )에서 JavaEE7 자습서를 살펴보면서 "Duke 's bookstore"자습서와 클래스 ( 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;
    }
}

따라서 오라클 직원들도 때때로 편리하게 컨벤션을 거래하는 것 같습니다.


13

우리의 코드베이스에서; 우리는 일반적으로 그들이 속한 클래스에 열거 형을 선언합니다.

여러분의 Fruit 예제를 위해 Fruit 클래스가 있고 그 안에 Fruits라는 Enum이 있습니다.

코드에서 참조하면 다음과 같습니다 Fruit.Fruits.Apple, Fruit.Fruits.Pear.

상수는 같은 라인을 따라 관련 클래스에서 정의됩니다 ( Fruit.ORANGE_BUSHEL_SIZE). 또는 "ConstantManager"라는 클래스 (또는 이와 동등한 클래스)에서 시스템 전체에 적용되는 경우 (즉, int에 해당하는 "널 값" ConstantManager.NULL_INT). (측면 참고; 모든 상수는 대문자입니다)

항상 그렇듯이 코딩 표준은 아마도 나와 다릅니다. 그래서 YMMV.


5
요즘 객체 팩토리의 이름이 복수형으로 명명 된 것처럼 보입니다 (예 : Lists및) Maps. 내 생각에 이것은 좋은 컨벤션이며 더 널리 사용되는 것을 완벽하게 지원합니다.
Esko

예, 개인 코딩 표준과 비슷하지만 직장 코딩 표준과 다릅니다. 우리는 일할 표준이 많지 않으므로 참조로 사용할 좋은 문서를 찾으려고 노력하고 있습니다.

8
Fruit.Fruits.Apple말 그대로 DRY 원칙을 어 기고 너무 나에게 장황합니다 :-) 예를 들어 선호합니다 Fruit.Type.APPLE.
Péter Török 2016 년

2
나는이 접근법을 좋아하지 않는다. 이것이 애플이라는 이름의 방식은 과일이거나, 애플은 과일이 아닌 것이 확실하지 않기 때문에 혼란 스럽습니다. 나는 Peter의 Type 예제를 좋아합니다. 적어도 APPLE은 일종의 과일이라는 자체 문서화입니다. 이 모든 과일의 예가 썩은 냄새를 맡지 만 ...
Mark Peters

1
나는 또한 이것을 좋아하지 않는다. '과일'클래스가 과일을 나타내면 '과일'은 무엇을 나타낼 수 있습니까? Fruit (클래스)이 실제로 Fruit를 처리하는 클래스 인 경우 이름을 "FruitHandler"또는 "FruitManager"로 변경해야합니다.
DJClayworth

7

그것들은 여전히 ​​타입이므로 클래스에 사용하는 것과 동일한 명명 규칙을 항상 사용합니다.

나는 "Class"나 "Enum"을 이름에 넣는 것에 눈살을 찌푸리게 될 것이다. a FruitClass와 a 가 둘 다 있으면 FruitEnum다른 것이 잘못되어 더 설명적인 이름이 필요합니다. 둘 다 필요로하는 종류의 코드에 대해 생각하고 있는데 Fruit열거 형 대신 하위 유형 이있는 기본 클래스 가 있어야합니다 . (그러나 그것은 내 자신의 추측 일뿐입니다. 내가 상상하는 것과 다른 상황이있을 수 있습니다.)

상수 이름을 지정하는 데 가장 적합한 참조는 변수 자습서 에서 제공됩니다 .

선택한 이름이 한 단어로만 구성되어 있으면 해당 단어를 모두 소문자로 입력하십시오. 하나 이상의 단어로 구성되는 경우 각 후속 단어의 첫 글자를 대문자로 입력하십시오. gearRatio 및 currentGear라는 이름이이 규칙의 주요 예입니다. 변수에 static final int NUM_GEARS = 6과 같은 상수 값이 저장되는 경우 규칙이 약간 변경되어 모든 문자를 대문자로 표시하고 후속 단어를 밑줄 문자로 구분합니다. 일반적으로 밑줄 문자는 다른 곳에 사용되지 않습니다.



1

$ 0.02를 추가 할 수 있으면 PascalCase를 C의 열거 형 값으로 사용하는 것이 좋습니다.

C에서는 기본적으로 전역 적이며 PEER_CONNECTED는 PeerConnected와 달리 실제로 피곤합니다.

신선한 공기를 마시십시오.

말 그대로 호흡이 쉬워집니다.

Java에서는 다른 클래스에서 정적 열거 이름을 가져 오기만하면 원시 열거 이름을 사용할 수 있습니다.

import static pkg.EnumClass.*;

이제 다른 방법으로 규정 된 규정되지 않은 이름을 사용할 수 있습니다.

나는 현재 C 코드를 Java로 포팅하는 것에 대해 생각하고 있으며 (자세한, 길고, 추악한) Java 컨벤션과 C 스타일을 선택하는 사이에 '찢어졌습니다'.

PeerConnected는 CONNECTED 인 switch 문을 제외하고 PeerState.CONNECTED가됩니다.

로 지금이 후자의 국제 대회에 말을 많이하고 모양 좋은 있지만 특정 '관용적 문구를 "수행 등 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.