2016-08-12 2 views
-4

Ist diese Klasse unveränderlich?Ist diese Klasse unveränderlich?

Ich versuche grob, die Richtlinien in "Effective Java", "Punkt 15: Minimieren Mutabilität" zu folgen, daher ist die Klasse nicht absichtlich "endgültig".

public class Result<T extends Number> { 
    private final Map<String, T> result; 

    private Result(final Map<String, T> result) { 
     this.result = result; 
    } 

    public static final Result<? extends Number> of() { 
     return new Result<>(new LinkedHashMap<>()); 
    } 

    /** Add or replace value. */ 
    public Result<T> put(final String key, final T value) { 
     result.put(key, value); 
     return new Result<>(Collections.unmodifiableMap(result)); 
    } 

    public T get(final String key) { 
     return Collections.unmodifiableMap(result).get(key); 
    } 

    @Override 
    public String toString() { 
     return result.toString(); 
    } 
} 
+5

Ich glaube nicht, weil Sie Ihre 'result' Karte mit dieser Linie' result.put (Schlüssel, Wert) geändert; ' –

+3

Nein, der' put' Methode es modifiziert. Wenn Sie möchten, dass es unveränderlich ist, müssen Sie nur das neue "Ergebnis" anders haben, nicht das Original. Als Randnotiz wird das Aufrufen von 'put' auf ein' Result', das von einem anderen 'put' zurückgegeben wird, eine Ausnahme auslösen. – resueman

+0

Was würde Sie glauben machen, dass es unveränderlich ist? Was glaubst du, ist die Definition von unveränderlich? –

Antwort

4

Nr Die put Methode sollte eine Kopie des Map machen, rufen Sie dann put auf der Kopie und geben einen neuen Result mit der kopierten Karte aufgebaut.

/** Add or replace value. */ 
public Result<T> put(final String key, final T value) { 
    Map<T> copy = new LinkedHashMap<>(result); 
    copy.put(key, value); 
    return new Result<>(copy); 
} 

Hinweis, dass die Umsetzung stützt sich auch auf alle Unterklassen von Number unveränderlich zu sein. Ansonsten gibt es auch ein Problem bei der Implementierung der get Methode.

public T get(final String key) { 
    //Relies on T being immutable 
    return result.get(key); 
} 
+2

'Beachten Sie, dass die Implementierung auch darauf angewiesen ist, dass alle Unterklassen von Number unveränderlich sind, oder machen Sie eine tiefe Kopie –

+0

Danke @AlekseiBulgak, fügte die Notiz hinzu. –

Verwandte Themen