Startseite bisherige Projekte Tools/Snippets Bücherempfehlungen Publikationen Impressum Datenschutzerklärung

Immutable Collection Builder für JavaJanuar 2019

Für den Fall, dass ein Set oder eine Map als Konstante gebraucht wird. Nur final davor schreiben reicht nicht...

/**
 * Hilfsklasse, um ein unveränderliches Set aus vorgegebenen Werten zu bauen. Nach dem Aufruf von
 * createImmutableSet() ist kein weiteres Hinzufügen von Elementen mehr möglich.
 * Verwendet das Builder-Pattern, die add(...)-Aufrufe können also verkettet werden.
 * Beispiel:
 * <pre>
 * private static final Set<Class<? extends ICommand<Type>>> COMMANDS =
 *  CollectionTools.UnmodifiableSetBuilder<Class<? extends ICommand<Type>>>()
                .add(InitMask.class)
                .add(LeseKontext.class)
                .createImmutableSet();
 * </pre>
 */
public static final class UnmodifiableSetBuilder<T>{
    private Set<T> set = new HashSet<>();
    boolean created = false;
    public UnmodifiableSetBuilder<T> add(T entry){
        if (created){
            throw new IllegalStateException("Unveränderliches Set wurde schon erzeugt.");
        }
        set.add(entry);
        return this;
    }
    
    public Set<T> createUnmodifiableSet(){
        created = true;
        return Collections.unmodifiableSet(set);
    }
}

/**
 * Hilfsklasse, um eine unveränderliche Map aus vorgegebenen Werten zu bauen. Nach dem Aufruf von
 * createImmutableMap() ist kein weiteres Hinzufügen von Elementen mehr möglich.
 * Verwendet das Builder-Pattern, die put(...)-Aufrufe können also verkettet werden.
 */
public static final class UnmodifiableMapBuilder<K, V>{
    private Map<K,V> map = new HashMap<>();
    boolean created = false;
    public UnmodifiableMapBuilder<K, V> put(K key, V value){
        if (created){
            throw new IllegalStateException("Unveränderliche Map wurde schon erzeugt.");
        }
        map.put(key, value);
        return this;
    }
    
    public Map<K, V> createImmutableMap(){
        created = true;
        return Collections.unmodifiableMap(map);
    }
}
Impressum - Datenschutzerklärung