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);
}
}