2009-06-09 3 views
5

클래스의 필드가 null로 설정되지 않도록하기위한 깨끗하고 안전한 방법을 찾고 있습니다. 필드 값을 클래스 생성자에서 한 번 설정하고 나중에 수정하지 않았 으면합니다. 나는 그가 C#에서 readonly 키워드를 허용한다고 생각한다. Java에서도 같은 작업을 수행 할 수 있습니까?필드가 Java 클래스에서 null이되지 않도록하는 방법

class foo 
{ 

    private Object bar; 

    public foo(Object pBar) 
    { 
    if(pBar == null) 
    { 
     bar = new Object(); 
    } 
    else 
    { 
     bar = pBar 
    } 
    } 

    // I DO NOT WANT ANYONE TO MODIFY THE VALUE OF bar OUT OF THE CONSTRUCTOR 

} 

답변

16

이 같은 final, 수 bar를 선언 : 당신은 키워드 최종 찾고

private final Object bar; 
7

.

class foo 
{ 
    private final Object bar; 

    public foo(Object pBar) 
    { 
     //Error check so that pBar is not null 
     //If it's not, set bar to pBar 
     bar = pBar; 
    } 
} 

이제 바는 변경할 수 없습니다

6

모두 이전의 답변이 정확하지만, pBar가 여전히 null로 설정 될 수있다 :

new foo(null); 

그래서 궁극적 인 대답은 마지막을 사용하는 것입니다 pBar가 null이 아닌지 확인하십시오 (이전처럼) :

public class Foo 
{ 
    private final Object bar; 

    public Foo(Object pBar) 
    { 
     if (pBar == null) 
     { 
      bar = new Object(); 
     }else{ 
      bar = pBar; 
     } 
    } 
} 
+1

+1하지만 예외를 던지거나 새로운 Object()를 자동으로 할당하는 대신 어설 션을 사용하는 것이 더 좋을 것이라고 생각합니다. –

1

필드를 final로 선언하고자합니다 .

private final Object foo; 

이렇게하면 w.r.t. 동시성은 생성자가 끝난 후에 필드가 초기화되도록 보장됩니다.

개체를 다른 개체로 바꾸는 것만 방지됩니다. 개체의 메서드 (예 : 개체)에 의해 개체가 수정되는 것을 방지하지 못합니다. setter와 달리 C/C++에서는 const와 다릅니다.