2012-12-10 2 views
2

저는 생성자에서 현재 초기화 된 private List<String> children;이라는 클래스를 가지고 있습니다. 그러나 이것은 항상 필요하지는 않으며 다른 함수가 필요할 때만 초기화하려고합니다.Java에서 멤버 arraylist 변수에 대한 지연 초기화를 구현하려면 어떻게해야합니까?

요점은 많은 코드로 변경하지 않고 현재 구현을 재 작업하는 것입니다.

다른 언어로하는 방법을 알고 있지만, Java 지식은 지금까지는 매우 제한적입니다.

답변

4

철자를 쓰는 방법 중 하나입니다 달성의 :

public class Whatever 
{ 
    private List<String> children; 

    public List<String> getChildren 
    { 
     if (children == null) { children = new ArrayList<String>(); } 
     return children; 
    } 
    ... 
} 

또한 기억하십시오. addChild(String child)을 필드에 직접 액세스하는 대신 get '로 표시합니다. 그리고 편집자가 실제로 편집증 및/또는 스레드 환경에서 작성하는 데 오랜 시간이 걸리는 경우 블록을 만들려고 할 수 있습니다. synchronized.

+0

바로 가기, 만약 당신이 화가를 공유한다면, 당신은 항상 그 작업을 snyc해야합니다! – Stefan

+0

또 다른 해결책은 반환 된 목록에 요소를 수정할 수 없도록 추가하는 것을 금지하고 addChild 메서드에서만 목록을 인스턴스화하는 것입니다. – omartin

3

children이 null 인 경우 게터에서 만들 수 있습니다. 적절한 동기화를 처리하십시오. children을 작성하는 데 비용이 많이 들지 않고 엄청난 양의 인스턴스를 생성하지 않으려면 열심히하십시오. 번거 로움을 덜어줍니다.

0

자바 숨기기 접근 자 메소드 뒤에있는 데이터 전송 객체의 멤버 변수, 자바 빈의 악명 높은 getter 및 setter입니다. 이렇게하면 List getChildren() 메소드에서 원하는 로직 (첫 번째 호출시 목록 생성, 외부 클라이언트로 반환 가능 목록 반환 등)을 추가 할 수 있습니다.