2012-04-05 5 views
2

Ich habe eine List<ParentObject> wo ParentObject ist wie folgt definiert:Unmodifiable Liste Wrapper, die einem anderen generischen Typ macht

public class ParentObject 
{ 
    ChildObject child1; 
    // and other stuff... 
} 

Ich mag würde belichten, dass List<ParentObject> anderen als unmodifiableList<ChildObject> durch eine Wrapper-Liste Konstruktion:

Ich kann diesen Ansatz nehmen und es funktioniert, aber das scheint wie ein Problem, das im Allgemeinen gelöst worden sein kann. Gibt es eine vorhandene Bibliothek, die einen Listen-Wrapper bietet, wie ich es vorschlage? Vermutlich würde ich eine Übersetzungsmethode definieren, die der Wrapper-Liste mitteilt, wie man die ChildObject von einer gegebenen ParentObject abruft.

Die grundlegende Frage ist: Ist das ein guter Ansatz oder gibt es eine Bibliothek (Guava oder Apache Commons Collections oder etwas), die bereits so etwas bietet?

Antwort

4

Der einfachste Weg

return Collections.unmodifiableList(Lists.transform(parentList, 
    new Function<ParentObject, ChildObject>() {...})); 

wäre dies mit Guava zu tun (Disclosure: Ich Guava beitragen.)

+0

Excellent. Genau das, was ich gesucht habe. Vielen Dank! – ulmangt

2

Statt List zu implementieren, erweitern Sie AbstractList. Wenn es nicht modifizierbar sein wird, müssen Sie nur size() und get(int index) implementieren, die trivial sind.

AbstractList implementiert den Rest durch Werfen UnsupportedOperationExceptions.

Ich kenne keine generische Liste, die bieten kann, was Sie fragen, aber es wäre nicht kompliziert zu bauen (würde nur Reflexion).

1

Ich denke, dass Sie dies mit Guava und dann Collections.unmodiableList erarbeiten können. In Guave, verwenden Lists.transform

Verwandte Themen