programing

생성자가 null 객체를 반환 할 수 있습니까?

nasanasas 2020. 10. 20. 07:41
반응형

생성자가 null 객체를 반환 할 수 있습니까?


오래된 코드를 살펴보면서이 보석을 발견했습니다.

MyObject o = new MyObject("parameter");
if (o == null) o = new MyObject("fallback parameter");

두 번째 줄은 Eclipse에서 데드 코드로 표시되어 있으며 그 이유를 이해합니다. 명시 적으로 예외가 발생하지 않는 것 같으며 MyObject생성자가 어떤 종류의 예외 (예 : NullPointerExceptions)도 발생 시킬 수 없습니다 .

내 질문은 null 검사가 있습니까? 이전 버전의 Java에서 생성자가 null을 반환 할 수 있었습니까? 아니면 단순히 쓸모없고 죽은 코드입니까?


코드는 모든 버전의 Java에서 죽었습니다. 생성자가를 반환하는 것은 불가능하며 생성자에서 null예외가 발생하더라도 다음 줄은 호출되지 않습니다.


아니요, 가능하지 않았습니다. 이전 버전의 코드에서 null을 반환 할 수있는 일부 팩토리 메서드를 사용했을 수 있습니다.

MyObject o = createMyObject("parameter");
if (o == null) o = createMyObject("fallback parameter");

에서 JLS의 섹션 15.9.4 :

클래스 인스턴스 생성 표현식의 값은 지정된 클래스의 새로 생성 된 객체에 대한 참조입니다. 식이 평가 될 때마다 새로운 개체가 생성됩니다.

따라서 아니요, null을 반환 할 수 없습니다.


내 생각 엔 그것이의 반환 값 테스트에 사용되는 C 프로그래머에 의해 작성되었습니다이다 malloc()를 들어 NULL, malloc()반환 할 수 있습니다 NULL당신의 시스템이 메모리 부족의 경우.

메모리가 부족하면 Java가 OutOfMemoryError`를 던지기 때문에 코드는 Java에서 의미가 없습니다.


대답은 간단합니다. 코드를 작성한 사람은 편집증적인 C ++ 프로그래머였습니다. C ++에서는 new operator를 오버로드하고이를 간단한 메모리 할당 자 (일명 malloc)로 사용할 수 있습니다.


이것은 단순히 쓸모없는 데드 코드였습니다. CTOR가 성공적으로 실행되면 개체에 대한 참조를 갖게됩니다.


당신이 만들 때 새 개체 () , 당신은 메모리에 주소를 생성하고,이 주소는 '널'이 아니라 개체가 비어있을 수 있습니다.

매개 변수에 의해 전송되는 Object에 대해 'null'을 테스트해야합니다.


오늘 내가 발견했듯이 다른 모든 답변에서 말한 내용에도 불구하고 PowerMock (또는 유사한 효과가있는 다른 모의 프레임 워크) Foo x = new Foo(...)을 사용하는 테스트 내에서 코드가 실행되는 경우 실제로 null을 반환 할 수 있습니다 .

PowerMockito.whenNew(Foo.class).withAnyArguments().thenReturn(mockFoo);

이 경우 Foo 생성자에있는 코드는 new Foo(...). 그러나 위의 방식으로 모의를 지정하지 않은 테스트를 작성하면 null대신 결과가 나올 수 있습니다 .

그러나 그러한 프레임 워크를 사용 하더라도 클래스에 추가 코드를 원하지는 않습니다. 테스트에서 개체를 적절하게 조롱하는 것을 잊은 경우를 우아하게 처리하기 위해서입니다! 코드가 실행되도록 의도 된 실제 시나리오 아닙니다 . 어쨌든 테스트 할 때만 활성화 된 코드는 제거되어야하며,이 경우에는 손상된 테스트에 대해서만 활성화됩니다.

따라서 PowerMock을 사용하는 경우에도 두 번째 줄은 "데드 코드"로 간주하여 제거해야합니다.


그것은 단순히 죽은 코드입니다.

new MyObject("parameter")nullJava의 어떤 버전에서도 반환되지 않습니다 .

참고 URL : https://stackoverflow.com/questions/11103444/can-constructor-return-a-null-object

반응형