명명 규칙 : 최종 필드 (정적 아님)


23

오늘 저는 finalJava 클래스 의 필드 이름 지정에 대해 동료와 토론했습니다 .

그의 opionion final필드에서도 인스턴스 생성 후에는 값이 변경되지 않으므로 상수로 간주해야합니다.

이로 인해 다음과 같은 final필드 명명 규칙이 적용 됩니다.

public class Foo {
    private static final String BLA_BLA = "bla";

    private final String BAR_BATZ;

    ...
}

필자의 의견으로는 static final필드 만 상수로 간주하고 필드 final는 일반적인 camelCase 명명 규칙을 따라야합니다.

public class Foo {
    private static final String BLA = "bla";

    private final String barBatz;

    ...
}

그가 나보다 훨씬 더 숙련 된 프로그래머이기 때문에 나는 약간 불확실하다. 나는 보통 그의 의견에 동의하고 그를 훌륭한 개발자라고 생각한다.

이것에 대한 입력?


당신의 예는 상수가 아닙니다. 컴파일 타임에 값을 할당하지 않았습니다. Ergo, 그들은 상수에 대한 명명 규칙을 따르지 않습니다.
Robert Harvey

@RobertHarvey 감사합니다. 맞습니다. 는 ...세트 가능한 생성자 상징하는 의미되었다 final필드를하지만 그건에 대해 분명히 불가능 static final필드.
Sascha Wolf

1
@Zeeker static { }클래스가로드 될 때 클래스 내에서 정적 필드를 한 번 설정하는 데 사용할 수있는 블록에 관심이있을 수 있습니다 . 관련 Java에서 정적 생성자로 작업 .

@RobertHarvey 나는 그것들에 익숙하다. 그럼에도 불구하고 감사합니다.
사샤 울프

1
변수가 인스턴스에 속하기 때문에 인스턴스마다 다르므로 상수로 적용되지 않습니다. 나는 낙타 사건을 사용할 것입니다.
Florian F

답변:


20

Sun (및 현재 Oracle) 은 Java Programming Language에 대한 Code Conventions 라는 제목의 문서를 유지 관리했습니다 . 이것에 대한 마지막 업데이트는 99 년이지만 스타일 가이드 라인의 본질은 계속 남아 있습니다.

9 장 에서는 명명 규칙에 대해 설명합니다.

'상수'의 식별자 유형 :

클래스 상수로 선언 된 변수와 ANSI 상수의 이름은 모두 밑줄 ( "_")로 구분 된 단어와 함께 대문자 여야합니다. 디버깅이 용이하도록 ANSI 상수를 사용하지 않아야합니다.

주어진 예 :

static final int MIN_WIDTH = 4;

static final int MAX_WIDTH = 999;

static final int GET_THE_CPU = 1;

더 최근의 문서에서-거기에 미끄러졌습니다. 에서 자바 언어> 언어 기본 사항 알아 변수 (자바 튜토리얼> :

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

Java를위한 많은 정적 분석기가이를 시행하려고합니다. 예를 들어 checkstyle은 다음을 시행합니다.

상수 이름이 format 속성으로 지정된 형식을 따르는 지 확인합니다. 일정한 정적 최종 필드 또는 제외 인터페이스 / 주석 필드이며, serialVersionUID그리고 serialPersistentFields. 형식은 정규식이며 기본값은 ^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$입니다.


이것은 실제로 코드를 작성하고 이상적으로 동일하게 유지하는 커뮤니티 의 규칙 으로 요약됩니다 .

위의 예제 static final는 C #define와 같은 C 규칙에서 파생 된 것으로, C 와 마찬가지로 런타임에 컴파일하지 않고 코드에서 대체됩니다.

그런 다음 질문해야 할 질문은 "이것은 상수처럼 작동합니까? 아니면 한 번 쓰기 필드처럼 작동합니까?"입니다. -그리고 그에 따라 규칙을 따릅니다. 그러한 질문에 대한 리트머스 테스트는 "객체를 직렬화하려면 최종 필드를 포함 하시겠습니까?"입니다. 대답이 상수라면 상수로 처리하십시오 (직렬화하지 마십시오). 반면, 직렬화해야 할 객체 상태의 일부이면 상수가 아닙니다.

어떤 경우이든, 코드 스타일을 고수하는 것이 중요합니다. 더 나쁜 문제는 단지 눈을 상하게하는 것보다 프로젝트 내에서 일관성이없는 관례에서 발생합니다. 정적 분석 도구를 가져와 일관성을 유지하도록 구성하십시오.



@RobertHarvey 인스턴스 필드가 상수처럼 동작하는 상황을 생각할 수 있습니다. 예를 들어, 팩토리는 객체에서 일정하지 않은 것을 채우는 것입니다.하지만 이것들은 왜 그렇게 할 것인지에 대한 생각만으로 머리를 아프게하는 오히려 고안된 예를 얻습니다.

이 자세한 답변에 감사드립니다. 객체의 직렬화에 대한 리트머스 테스트가 나를 대신했습니다.
Sascha Wolf 1

한 동료가 최근에 한 번은 편집자가 정적 / 정적 결승 등을 강조하는 데 능숙하지 못했기 때문에이 명명 규칙이 중요하다고 동료가 최근에 지적했습니다. 요즘 IDE는 꽤 좋으므로 예를 들어 MinWidth대신에 더 좋은 이름을 만들 수 있습니다 MIN_WIDTH. 또 다른 질문은 정적 최종 로거는 어떻습니까? 당신이 그들에게 전화합니까 LOG/ LOGGER또는 log/ logger. 개인적 log으로 코드와 인라인이 더 좋아 보이지만, 일관성이없는 경우는 언제입니까?
ndtreviv 2016 년

5

BAR_BATZ이 예제에서는 상수가 아닙니다. 의 생성자 Foo는 객체 수준에서 다른 값으로 설정할 수 있습니다. 예를 들어

public class Foo {
    private final String BAR_BATZ;

    Foo() {
       BAR_BATZ = "ascending";
    } 

    Foo(String barBatz) {
       BAR_BATZ = barBatz;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.