[java] 기본 필드 초기화에 의존-나쁜 프로그래밍 스타일입니까? [닫은]

공식 오라클 문서에 대한 링크가 제공되었습니다 : https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

그것이 말하는 곳 :

기본값

필드가 선언 될 때 항상 값을 할당 할 필요는 없습니다. 선언되었지만 초기화되지 않은 필드는 컴파일러에서 적절한 기본값으로 설정됩니다. 일반적으로 말하면이 기본값은 데이터 유형에 따라 0 또는 null입니다. 그러나 이러한 기본값에 의존하는 것은 일반적으로 잘못된 프로그래밍 스타일로 간주됩니다.

이 부분을 강조하고 싶습니다 :

그러나 이러한 기본값에 의존하는 것은 일반적으로 잘못된 프로그래밍 스타일로 간주됩니다.

그러나 이것은 언어 변수의 인스턴스 변수가 기본값을 가지고 있다는 것을 아는 기본적인 부분입니다. Java SE 라이브러리 소스 코드에서도 널리 사용된다면 왜 이것이 나쁜 프로그래밍 관행 입니까?



답변

인용 된 텍스트는 다음과 같습니다.

“그러나 이러한 기본값에 의존하는 것은 일반적으로 잘못된 프로그래밍 스타일로 간주됩니다.”

냉소적으로 : “일반적으로 그렇게 생각된다”는 것은 종종 저자가 제시된 진술에 대한 권위있는 출처를 찾지 않았다는 것을 말하는 방법입니다.

이 경우 주장은 분명히 의문이다. 증거 : 5 가지 중 5 가지 Java 스타일 가이드는 기본값에 의존해야하는지 또는 의존해야하는지에 대해 아무 말도하지 않습니다.

(샘플링을위한 나의 방법론은 “java 스타일 가이드”에 대한 최초의 5 가지 Google 검색 히트를 살펴 보는 것입니다. 그런 다음 각 문서에서 “기본”을 검색했습니다. 이것은 철저한 분석은 아니지만 내 요점을 밝힙니다. )


확인. Java 코드의 가독성을 실제로 지원합니까?

이것은 논쟁의 여지가 있습니다.

한편, 기본 초기화에 대해 배우지 않은 초보자 Java 프로그래머는 0 또는 null이 어디에서 왔는지에 대해 당황 할 수 있습니다. 그러나 그들이 명시적인 초기화를 찾고 귀찮은 것을 찾지 않는다면, 그것들은 기본 초기화에 대해 알아 내기 위해 튜토리얼이나 책을 읽도록 충분해야합니다. (당신은 희망합니다!)

반면에, 우리는 일반적으로 초보 Java 프로그래머가 프로덕션 코드 기반을 유지할 것으로 기대하지 않습니다. 숙련 된 Java 프로그래머의 경우 중복 초기화는 가독성을 향상시키지 않습니다. (최고의) 소음입니다.

내 생각에, 필드의 중복 초기화로 달성되는 유일한 것은 코드의 미래 독자 에게 초기 값에 대해 생각 했다는 신호를 보내는 것 입니다. @GhostCat이 표현한 것처럼 기본 초기화는 의도를 전달하지 않습니다.

그러나 반대로 그 독자라면 코드 작성자의 생각을 반드시 신뢰할 필요는 없습니다. 따라서이 “신호”의 가치도 의문의 여지가 있습니다.


신뢰성은 어떻습니까?

Java에서는 아무런 차이가 없습니다. JLS 는 필드에 기본 초기화 가 수행 되도록 지정 합니다. 반대로 로컬 변수의 경우 초기화되지 않은 변수를 사용하는 것은 컴파일 오류입니다.

간단히 말해서, 명시 적으로 초기화되지 않은 변수의 런타임 동작은 완전히 예측 가능합니다.

변수가 초기화되지 않을 수있는 C 또는 C ++와 같은 언어에서는 이와 달리 동작이 지정되지 않아 충돌이 발생하고 플랫폼마다 동작이 달라질 수 있습니다. 항상 명시 적으로 변수를 초기화하는 경우가 훨씬 강력합니다.


성능은 어떻습니까?

차이가 없어야합니다. JIT 컴파일러는 중복 초기화와 기본 초기화를 동일하게 취급 할 수 있어야합니다.


답변

단순 : 기본값을 사용한다고해서 의도를 알 수 없습니다.

해당 필드를 0으로 시작하겠습니까, 아니면 값을 할당하는 것을 잊었 습니까?!

물론 null 참조는 nullpointer 예외를 실행하는 데 필요한 두 가지 중 절반입니다.

마지막으로 기본값을 사용하면 최종 필드가 아닌 것을 의미합니다. 가능한 한 피하십시오.

유일한 반론은 : 왜 당신이 필요하지 않은 것들을 적는가? 그러나 나열된 단점은 나름대로 필드에 0을 할당하는 것이 컴파일러에 남겨 두는 것보다 낫다고 생각합니다.


답변

지구상에서 이것이 왜 나쁜 프로그래밍 관행입니까?

기본 값을 사용하는 경우 의도적으로 코드를 기본값으로 두거나 코드 를 할당 하지 않은 경우 코드를 읽는 사람에게 즉시 명확하지 않습니다 .

… Java SE 라이브러리 소스 코드에서도 널리 사용되는 경우 ??

Java 소스 코드는 실제 코딩 실례의 예로 의존해야하는 것이 아닙니다. 이러한 규칙을 위반하는 경우가 종종 있습니다 (때로는 의도적으로 약간의 성능 향상을 위해, 때로는 실수로 또는 허용 된 스타일이 수년에 걸쳐 변경 되었기 때문에).


답변