2009-06-07 1 views
1

는, 누군가가 최종 초기화가 연기 될 수 있음을 언급하고 예를 제공합니다java에서 최종 초기화를 연기 할 수 있습니다. 실수로 null을 반환하지 않도록하려면 어떻게해야합니까? 은 "숨겨진 기능 자바의"질문에

public Object getElementAt(int index) { 
    final Object element; 
    if (index == 0) { 
     element = "Result 1"; 
    } else if (index == 1) { 
     element = "Result 22"; 
    } else { 
     element = "Result 3"; 
    } 
    return element; 
} 

포스터는 말한다을 :

그것은 사건을 그리워 너무 쉽게하고 우연히 null을 반환합니다. null을 돌려주는 것을 불가능하게하지는 않습니다 만, 목적 상으로는 명백합니다.

그러나 나는이 말의 의미를 머리 속에 감쌀 수 없습니다. 요소가 최종 선언되지 않은 경우 어떻게 다른가? else 문이 항상 null이 반환되지 않도록 보장하지 않겠습니까? 나는 이것이 실제로 코드가 작동하는 방식에 영향을 미치기보다는 외관상의 것이라고 생각합니다.

답변

4

당신이 질문을 게시하는 방법은, 포스터는 당신이 한 경우라고 말하는 것 같다 :

Object element = null; 

그리고이를 통해 그것을 설정, 당신은하지 않았다 경우 방법, 당신은 (사고로 null을 반환 할 수 있다면 else 문을 올바르게 작성하십시오.) 따라서 최종 초기화가 선언 이후와 다를 수 있다는 사실을 이용하십시오.

그러나 컴파일러는이 변수가 로컬이기 때문에이 변수가 사용되기 전에 설정되므로이 예제는 불필요합니다.

이 같은 경우 것보다 재미 : 당신이 경우 어떻게 될지 인 당신을 위해 null로 오히려 설정보다, 요소를 설정하지 않을 경우 컴파일러가 경고합니다이 경우

public class SomeClass { 
    private final Object element; 

    public SomeClass(int index) { 
      if (index == 0) { 
       element = "Result 1"; 
      } else if (index == 1) { 
       element = "Result 22"; 
      } else { 
       element = "Result 3"; 
      } 
    } 
} 

최종 선언되지 않았습니다.

요약하면 흥미로운 사실은 마지막 필드 또는 변수를 선언 할 위치에 설정할 필요가 없다는 것입니다 (생각하는 것처럼 생각할 수도 있음). 최종은 선언 된 것과 동일한 행에 설정되어야하는 것이 아니라 지정된 값으로 한 번만 설정할 수 있음을 의미합니다.

+0

두 번째 예제를 사용하면 컴파일러에서 "최종 가변 요소에 값을 할당 할 수 없습니다."를 반환합니다. My IDE는 field 요소를 final이 아닌 것으로 만들 것을 권장합니다. – danieljimenez

+0

두 번째 예를 명확히했습니다. 요점은 최종 필드가 메서드가 아니라 클래스의 생성자에서 설정된다는 것입니다. 이니셜 라이저도 작동합니다. – Yishai

+0

좋습니다. 또한 제 질문은 분명하지 않다고 생각합니다. 사과드립니다. OP는 이것이 null 값으로부터 보호하는 방법을 언급했습니다. 그러나 당신은 이것을 분명히했습니다. 그들의 예를 말할 수있는 것에서부터 그들이 설명하는 것의 예가 아닙니다. – danieljimenez

1

결승은 설정할 수 없으며 결코 다시 설정할 수 없습니다. 때때로 java의 상수 개념과 충돌합니다. 더 정확하게 그들은 불변의 객체 참조이다.

무언가가 불변하다면, 어떻게 그리고 언제 초기 값을 설정 하는가? 대답은 자바가 오직 하나의 가능한 흐름 만이 최종 변수에 값을 할당 할 수 있는지를 검사한다는 것입니다. 그렇게하면 선언시에 값을 할당 할 필요가 없습니다.

+0

나는 이것이 약간의 설명이 필요하다고 느낀다. 최종 변수는 객체에 대한 불변 참조이며, 객체 자체는 가장 확실하게 * 불변 *이 아닙니다! 오브젝트의 모든 필드가 불변 인 경우, 오브젝트는 불변으로됩니다 (복잡한 필드의 경우도 불변으로 할 필요가 있습니다).불행하게도 Java는 불변 객체에 대한 개념을 가지고 있지 않다. ( –

+0

@Gerco Dries : 변수는 참조 일 필요는 없다. – newacct

관련 문제