2014-02-18 3 views
-1

궁금하네요 :wsimport (xjc) - getter가 항상 null 체크를 사용하는 이유는 무엇입니까? (XSD에서) 생성 된 목록 게터는 항상 null 체크가 왜

public class Response { 

    @XmlElement(type = Integer.class) 
    protected List<Integer> integers; 

    public List<Integer> getIntegers() { 
     if (integers == null) { 
      integers = new ArrayList<Integer>(); 
     } 
     return this.integers; 
    } 
} 

질문 :

이유는 무엇입니까? 그 이유는 무엇입니까? 어떤 좋은 것이 있습니까?

어떤 경우에는 이것이 좋지 않기 때문에 나는 묻습니다. 그리고이 행동을 바꿀 방법이없는 것처럼 보입니다.

+0

"어떤 경우에는 이것이 좋은 것이 아니기 때문에 묻습니다."이것에 대해 설명하는 마음입니까? –

+0

@Josh M, 예를 들어 Dozer를 사용하여 같은 유형의 개체를 병합합니다. 소스 객체에는 null 목록이 있지만 getters 목록 호출 후 초기화됩니다. 그래서 소스 객체는 빈리스트를 가지므로 대상 객체는 빈리스트를 가진다. 복잡한 구조를 가지고 있으며 빈리스트를 초기화하고 싶지 않습니다. 원본 개체가 변경되어 변경되지 않아야합니다. 그리고 getter를 생성하는 방법을 바꾸는 방법이 없으므로 이런 식으로 getter를 생성하는 것이 좋은 이유가 있다고 가정합니다. 내 질문으로 돌아 가기 : 그 이유는 무엇입니까? – Hubert

+0

나는 downvotes를 얻으므로 이것은 정말 어리석은 질문이라고 생각한다. 왜 나는 발전기가 이런 식으로 작동하는지 모르겠다. 좋은. – Hubert

답변

4

파고 조금 후에, 이유는 분명해진다. 나는 xjc와 함께 몇 가지 코드를 생성하고 목록 속성에 대해,이 코멘트 작성 :

/** 
* Gets the value of the bars property. 
* 
* <p> 
* This accessor method returns a reference to the live list, 
* not a snapshot. Therefore any modification you make to the 
* returned list will be present inside the JAXB object. 
* This is why there is not a <CODE>set</CODE> method for the bars property. 
* 
* <p> 
* For example, to add a new item, do as follows: 
* <pre> 
* getBars().add(newItem); 
* </pre> 
* 
* 
* <p> 
* Objects of the following type(s) are allowed in the list 
* {@link Bar } 
* 
* 
*/ 

이 자신의 의도를 명확하게합니다. 그들은 객체에서 오래된 List을 갖는 것이 불가능하기를 원했기 때문에 항상 복사본을 만드는 대신 라이브리스트를 반환합니다. 즉, getter에 대한 여러 호출 (예 : 다른 스레드 또는 다른 컨텍스트에서)은 항상 동일한 메모리 내 객체에 대한 참조가 제공됩니다. 그러나 이것을하면 설정자가 없거나 계약을 파기 할 수 있습니다. 컨텍스트 A가 값을 설정할 수 있고 컨텍스트 B가 이전 값에 대한 부실한 참조를 가지며 그것이 바뀌 었다는 것을 알아라.

디자인 결정으로 인해 세터가 없으므로 항목을 추가하거나 제거해야하는 경우 목록을 변형 할 수있는 방법이 필요했습니다. 그렇지 않으면 처음에 null 목록은 언제나 null (영원히 반사됨에 의한 헛소리를 금지)이됩니다. 따라서이를 허용하는 나머지 방법은 getter에서 null을 검사하고 그 시간에 lazy-initialize하는 것뿐입니다. 즉 그 답을 알 수있는 팀 외부 사람에 대한 방법이 없습니다 ... 그들은이 디자인을 선택한 이유 전체 목록을 교체 할 계획이 에 관해서는

foo.getBars().clear(); 
foo.getBars().addAll(someList); 

해야했다 것을 의미했다. 그러나 일반적으로 어쨌든 대부분의 코드를 따르는 것이 매우 좋은 패턴입니다 (커플 링이 줄어들고 컴파일러가 경고 할 수없는 일반적인 오류 조건이 없어집니다). 따라서 그에 대한 논쟁을 많이하기 어렵습니다. 실제로 문제가 발생하는 경우 (그리고 실제로는 보이지 않는데, null이 아닌 복사 작업 후에 빈 목록이있는 객체가 아닌 것), 내가 드릴 수있는 유일한 조언은 다음과 같습니다. 코드 생성기를 사용하지 않거나 xjc에 대한 확장명을 작성하여 원하는대로 할 수 있습니다. 이 경우에도 기존 확장 기능이있을 수 있습니다. 나는 모른다.

+0

이것은 좋은 대답입니다. 그래서 받아 들여질 수 있다고 생각합니다. 노력해 주셔서 감사합니다. 좋은 하루 되세요. – Hubert