2016-07-20 8 views
-1

Ich habe eine Klasse, die wie folgt aussieht.Klonen von Set-Schnittstelle

Ich möchte den Klon des Satzes durch den Getter und nicht den Verweis auf den Satz selbst zurückgeben. Da set eine Schnittstelle ist, gibt es keine Klonmethode.

class User{ 
    public static void main(String[] args){ 
     HashSet<String> hs=new HashSet<String>(); 
     hs.add("str1"); 
     hs.add("str2"); 
     ClassName cn=new ClassName(hs); 
     HashSet<String> newHS=cn.getSet(); 
     newHS.add("str3"); 
    } 
} 

Wenn ich Bezug auf den Satz zurückzukehren selbst, dann ist die Methode, um die Set bekommen könnte aus dem Set hinzufügen oder löschen, die wie in den obigen Klasse Benutzern nicht günstig ist. Kann jemand vorschlagen, das Set zu klonen?

Der Grund für die Verwendung eines Sets und nicht eines HashSet oder TreeSet ist, weil dies den ClassName wiederverwendbar machen würde, da ich den ClassName nicht ändern muss, wenn ich in Zukunft eine andere Art eines Sets verwenden möchte.

+0

'.clone()' ist in Java gebrochen, war immer schon immer, Sie wollen nie '.clone()' verwenden. Es scheint, dass Sie wirklich nur eine 'ImmutableSet'-Ansicht des Backing-Sets wünschen. –

Antwort

-1

Wenn Sie keine zusätzlichen Bibliotheken abrufen möchten, sollten Sie die Gruppe in Konstruktor kopieren und in getter return unmodifiableSet.

class ClassName{ 
    private Set<String> set; 

    public ClassName(Set<String> set){ 
     this.set= new HashSet<>(set); 
    } 

    public Set<String> getSet(){ 
     return Collections.unmodifiableSet(set); 
    } 
} 

Wenn Sie Guava-Bibliothek auf Ihrem Classpath haben oder nicht dagegen Abhängigkeit in Ihrem Projekt hinzufügen, dann gibt es eine viel bessere Möglichkeit, ImmutableSet als Mitglied Variable.