2011-11-18 3 views
1

클래스의 기능 목록을 유지 관리하는 클래스가 있습니다. 이러한 기능은 읽기와 비교하여 드물게 변경됩니다. 읽기는 거의 항상 기능 목록을 통한 반복입니다. 이 때문에 나는 CopyOnWriteArrayList을 사용하고 있습니다.Java의 CopyOnWriteArrayList에서 기본 정적 배열을 어떻게 가져 옵니까?

function Feature[] getFeatures() { 
    .. implementation goes here .. 
} 

내가 인정이, 이유는 게으름의 비트 수 있습니다 :

는이 같은 기능을 갖고 싶어. 나는 다음과 같은 코드를 작성하고 싶습니다 :

이보다는
for (Feature f: object.getFeatures()) { 
    .. do something interesting .. 
} 

:

Iterator<Feature> iter = object.getFeatureIterator(); 
while (iter.hasNext()) { 
    Feature f = iter.next(); 
    .. do something interesting .. 
} 

주요 질문입니다 - 내가 여기 게으른 것입니까? 이 패턴을 많이 따르겠습니다. 코드의 첫 번째 부분은 유지하기가 훨씬 쉽습니다. 분명히, 나는 기본 배열을 변경하지 않을 것이며, 나는 이것을 문서에 넣을 것이다.

이 상황을 처리하는 적절한 방법은 무엇입니까?

답변

1

그냥 목록에 toArray 메소드를 호출 :

foreach는 구문은 모두의 Iterable 객체와 함께 사용, 당신은 단지

public List<Feature> getFeatures() { 
    return this.features; 
} 
을 가질 수 있도록 목록, Iterable을하다 할 수있다
public Feature[] getFeatures() { 
    return this.featureList.toArray(new Feature[this.featureList.size()]); 
} 

하는 것으로

및 동일한 foreach 루프를 사용하십시오.

public List<Feature> getFeatures() { 
    return Collections.unmodifiableList(this.features); 
} 
+0

'Collections.unmodifiableList'는 동일한 기본 배열을 통해 반환되는'List'에 복사합니까? –

+0

아니요. 모든 읽기 전용 작업을 래핑 된 목록 (size(), get() 등)에 위임하고 모든 수정 메서드 (set(), add() 등). –

1

이유를 모르겠다 : List<Feature>을 반환하고 CopyOnWriteArrayList 또는 수정 불가능한 복사본을 사용하고 foreach을 사용하십시오. 배열을 왜 특별히 원하는가요?

+0

을 복사하지 않는으로 CopyOnWriteArrayList 복제를 복제 할 수 있습니다. 어쩌면 이것은 완전히 분명한 사실을 놓치고있는 뇌의 방귀 일 것입니다. 사실, 그 대답은 여기에있는 것 같습니다. –

1

클래스 CopyOnWriteArrayList 구현 Iterable, 당신은 설탕 for 루프 구문을 사용하는 데 필요한 모든 것입니다 : 당신은 발신자가 내부 목록을 수정하지 않으려면,리스트의 변경 불가능한 뷰를 돌려줍니다. 위에 설명 된 경우 명시 적으로 Iterator을 보유 할 필요는 없습니다.

컴파일되지 않았습니까?

1

당신은 목록

public List<Feature> getFeatures() { 
    return (List<Feature>)this.features.clone(); 
} 

모르겠어요 기본 배열

+0

해킹과 같은 것 같습니다 (즉, 결코 '복제'를 사용하지 마십시오). 이게'Collections.unmodifiableList'를 사용하는 것보다 낫지 않습니까? –