Package: ClassObjectMap
ClassObjectMap
| name | instruction | branch | complexity | line | method | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ClassObjectMap() | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| copy() | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| equals(Object) | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| get(Class) | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| getBySuperclass(Class) | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| hashCode() | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| isEmpty() | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| lambda$getBySuperclass$0(Class) | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| put(Object) | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| putAll(Object[]) | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| putIfNotExists(Object) | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| toString() | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
| valueStream() | 
 | 
 | 
 | 
 | 
 | ||||||||||||||||||||
Coverage
1: package util;
2: 
3: import persist.Persistierer;
4: 
5: import java.util.Arrays;
6: import java.util.HashMap;
7: import java.util.Map;
8: import java.util.Optional;
9: import java.util.Set;
10: import java.util.stream.Collectors;
11: import java.util.stream.Stream;
12: 
13: /**
14:  * eine Map, welche zu einer Klasse immer genau ein Objekt der Klasse halten kann.
15:  *
16:  * @param <T> Klasse, von welcher sämtliche Elemente in der Map erben müssen.
17:  */
18: public class ClassObjectMap<T> {
19:     private final Map<Class<? extends T>, T> map;
20: 
21:     /**
22:      * erstellt eine neue {@link ClassObjectMap}.
23:      */
24:     public ClassObjectMap() {
25:         this.map = new HashMap<>();
26:     }
27: 
28:     /**
29:      * fügt ein neues Element der {@link ClassObjectMap} hinzu. und ersetzt ggf. dabei das alte Element, falls es bereits eines derelben Klasse gab.
30:      *
31:      * @param element hinzuzufügendes Element.
32:      * @return die {@link ClassObjectMap} selbst zum damit weiterarbeiten <3
33:      */
34:     public ClassObjectMap<T> put(final T element) {
35:         this.map.put((Class<? extends T>) element.getClass(), element);
36:         return this;
37:     }
38: 
39:     /**
40:      * {@link ClassObjectMap#put(Object)} für sämtliche übergegene Elemente.
41:      *
42:      * @param elements Übergebene Elemente in Form einer Liste.
43:      */
44:     @SafeVarargs
45:     public final void putAll(final T... elements) {
46:         Arrays.asList(elements).forEach(this::put);
47:     }
48: 
49:     /**
50:      * @param clazz Klasse deren Objekt geholt werden soll
51:      * @param <E>   Klasse deren Objekt geholt werden soll
52:      * @return ein {@link java.util.Optional} des Objektes der Klasse clazz, welchem kein Element hinterlegt ist, wenn die Map kein Element der Klasse hinterlegt hat.
53:      * ansonsten das hinterlegte Element.
54:      */
55:     public <E> Optional<E> get(final Class<E> clazz) {
56:         return Optional.ofNullable((E) this.map.get(clazz));
57:     }
58: 
59:     /**
60:      * @return erstellt eine DeepCopy der {@link ClassObjectMap}.
61:      */
62:     public ClassObjectMap<T> copy() {
63:         return (ClassObjectMap<T>) Persistierer.vonXML(Persistierer.zuXML(this));
64:     }
65: 
66:     /**
67:      * @param clazz Klasse bzw. Interface, zu welchem alle Objekte geholt werden sollen, die diese Klasse/ Interfacew sind, erweitern oder implementieren.
68:      * @param <U>   Klasse bzw. Interface, zu welchem alle Objekte geholt werden sollen, die diese Klasse/ Interfacew sind, erweitern oder implementieren.
69:      * @return Set von Objekten, welche {@code clazz} sind, erweitern oder implementieren.
70:      */
71:     public <U> Set<U> getBySuperclass(final Class<U> clazz) {
72:         return this.map.keySet().stream().filter(clazz::isAssignableFrom).map(key -> (U) this.map.get(key))
73:                 .collect(Collectors.toSet());
74:     }
75: 
76:     /**
77:      * Liefert true, wenn die Map keine Einträge besitzt.
78:      *
79:      * @return true, wenn die Map keine Einträge besitzt.
80:      */
81:     public boolean isEmpty() {
82:         return this.map.isEmpty();
83:     }
84: 
85:     @Override
86:     public String toString() {
87:         return this.map.values().toString();
88:     }
89: 
90:     /**
91:      * @return liefert einen Stream sämtlicher Werte aus der {@link ClassObjectMap}.
92:      */
93:     public Stream<T> valueStream() {
94:         return this.map.values().stream();
95:     }
96: 
97:     @Override
98:     public boolean equals(final Object o) {
99:•        if (this == o) {
100:             return true;
101:         }
102:•        if (!(o instanceof ClassObjectMap)) {
103:             return false;
104:         }
105: 
106:         final ClassObjectMap<?> that = (ClassObjectMap<?>) o;
107: 
108:         return this.map.equals(that.map);
109:     }
110: 
111:     @Override
112:     public int hashCode() {
113:         return this.map.hashCode();
114:     }
115: 
116:     /**
117:      * fügt das gegebene Element der {@link ClassObjectMap} hinzu, falls kein Element des Typen bereits in der Map ist.
118:      *
119:      * @param element
120:      *                 ggfs. hinzuzufügendes Element.
121:      * @param <U>
122:      *                 Typ des Elements das hinzugefügt wird, bzw. schon drin ist.
123:      *
124:      * @return das Element, welches drin lag, falls schon eins da war, sonst das neu hinzugefügte.
125:      */
126:     public <U extends T> U putIfNotExists(final U element) {
127:         final Optional<?> o = this.get(element.getClass());
128:•        if (!o.isPresent()) {
129:             this.put(element);
130:             return element;
131:         }
132:         return (U) o.get();
133:     }
134: }
    