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


20

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

그것이 말하는 곳 :

기본값

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

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

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

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


5
허. 나는 그 진술이 거기에 있다는 것을 결코 알지 못했습니다. 나는 실제로 그것들에 의존하는 것이 좋은 습관이라고 생각합니다. private int count = 0;아무것도하지 않는 코드이고, 아무것도하지 않는 코드는 복잡합니다. java.lang에서 클래스를 가져 오거나로 클래스를 선언하는 것과 같습니다 extends Object.
VGR

2
... 또는 public abstract인터페이스에 메소드가 있습니다.
mumpitz

1
공개 초록에 어떤 문제가 있습니까?
John Keates 1

1
퍼즐 조각은 C ++에서 나올 수 있습니다. 널리 사용되는 언어이며 기본 초기화 대 제로 초기화 처리는 버그의 지속적인 원인입니다. C ++에서 가장 예외적 인 경우를 제외하고는 기본값을 사용하는 것은 나쁜 생각입니다. 문화적으로 Java로 유출되었을 수 있습니다.
Cort Ammon

@JohnKeates-내 Java는 약간 녹슬었지만 private인터페이스의 메소드는 의미가 없으며 abstract암시 적입니다.
Scott Smith

답변:


6

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

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

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

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

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


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

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

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

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

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

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


신뢰성은 어떻습니까?

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

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

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


성능은 어떻습니까?

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


19

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

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

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

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

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


3
예 : 다시 : 의사 소통 의도 없음- "관리자 매니"가 코드를보고 특정 데이터 유형의 기본값이 무엇인지 모르는 경우 그는 실제로 NULL 일 때 0이라고 가정하고 === check (또는 value & type에 대한 동등한 동등 검사가 java, equals ()?)의 전체 버그입니다. (경험이없는 프로그래머를위한) 검색 시간은 아주 간단한 결과 일 수 있습니다. 추신 : 악마의 옹호자 나는 하루 종일 기본값을 사용한다고 말하지만 (내가 결코하지는 않지만) 똑똑한 사람들 (또는 적어도 세부 사항에주의를 기울여)으로 코드를 유지하십시오.
TCooper

@TCooper 관리자가 Java에 대해 거의 알지 못하면 실제 Java 코드를 다루는 비즈니스가 없습니다. 그러나 나는 기본 개념에 동의합니다. 초보자에게는 더 힘들다.
GhostCat은 Monica C에게 경의를 표합니다.

12

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

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

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

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


2
나는 동의하지 않지만 아마도 옳습니다.
VGR

3
@VGR 기본값에 의존하는 것이 최적이 아니라는 주장에 동의하는 한, 그 이유 때문에 중립적 인 표현으로주의를 기울였습니다. 코드 품질은 주관적이며 이것이 보편적 인 견해가 아님을 잘 알고 있습니다.
Michael Berry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.