Collections, Utils, JPA
Folgendes lernte ich bei einem Code-Review bei Michael:
Collections
Wir repetierten und kontrollierten nochmal die Kenntnisse von Collections in Java.
Listen -
ArrayList - Einfache Liste wenn reihenweise Elemente eingefügt und über die Collection iteriert werden muss.
LinkedList - Wenn häufig am Anfang Elemente eingefügt oder zwischendrin Elemente gelöscht werden.
Sets - Wenn die Eindeutigkeit wichtig ist
HashSet - Ist schneller als TreeSet, garantiert aber keine Ordnung
TreeSet - Garantiert Wert-Ordnung
LinkedHashSet - Fügt Elemente geordnet ein
Maps - Wenn Key-Values gebraucht werden
HashMap - Maximaler Speed aber keine Ordung
TreeMap - Ist natürlich sortiert oder nach einem Comperator
LinkedHashMap - Wenn die Ordung wichtig ist
MultiKeyMap - Können mehrere Keys für einen Wert hinzugefügt werden
MultiKeyMap multiKeyMap = new MultiKeyMap(); multiKeyMap.put("key1", "key2", "key3", "value");
MultiValueMap - Können mehrere Werte für einen Key hinzugefügt werden.
MultiValueMap multiValueMap = new MultiValueMap(); multiValueMap.put("key", 1); multiValueMap.put("key", 2); List values = (List) multiValueMap.get("key"); for (String keyString : (Set) multiValueMap.keySet()) { List valueInts = (List) multiValueMap.get(keyString); }
Appache commons Utils
Die folgenden Utils sind praktische Bibliotheken die viel Arbeit abnehmen:
commons:
lang
colloctions
io
beanutils
Beispiel BeanUtils:
Liest alle Properties eines Beans (Felder die einen Getter zur Verfügung stellen) in eine Map:
Map<String, Object> properties = null; try { properties = PropertyUtils.describe(proposal.getObjectData()); } catch (Exception e) { log.error(e.getStackTrace().toString()); }
Die Values in der Map repräsentieren die Werte der Properties und die Keys die Namen. Folgendermassen kann über die Map iteriert werden:
for (Object o : properties.values()) { if (o != null) { hasObjectData = true; } }
JPA
Weiter haben wir JPA nochmals repetiert. Über Annotationen können Felder gekenntzeichnet werden. So kann eine Beziehung unidirektional oder bidirektional gemacht werden. Unidirektional bedeutet die Navigation von einem zum anderen Objekt(n) und bidirektional bedeutet sowohl vom einen zum anderen Objekt(n). Beispiel: Unter Anderem gibt es die Situtuation dass ein Element mehrere andere Elemente besitzt. Beispielsweise ein Auto hat mehrere Räder. Zwei Möglichkeiten:
@ onetomany List<R> rs; (Im Objekt Auto. Ein Auto hat mehrere Räder) Auto a; (Im Objekt Rad. Ein Rad hat ein Auto)
List<R> rs; (Im Objekt Auto. Ein Auto hat mehrere Räder) @ manyToOne Auto a; (Im Objekt Rad. Ein Rad hat ein Auto)
Das Beispiel ist jetzt nur unidirektional, da es wesentlich weniger Fehleranfälliger ist als bidirektional. Wenn in diesem Beispiel eine bidirektionale Navigation gewünscht ist müssten Beide Felder pro Möglichkeit annotiert werden. So würde sowohl das Auto die Räder kennen und die Räder das Auto. In der ersten Möglichkeit kennt das Auto seine Räder und in der Zweiten die Räder das Auto. Wichtig zu wissen ist, dass wenn die Annotation auf Listen gemacht wird (erste Möglichkeit), werden die Elemente nur "lazy" geladen. Konkrett heisst das, dass bei jedem Aufruf Elemente per Abfrage geholt werden müssen um eine LazyException zu vermeiden. Somit kann man schon jetzt sagen, dass die zweite Möglichkeit viel weniger Fehleranfällig ist als die erste. Die zweite Möglichkeit holt immer sein Element. Also das Rad holt sich immer sein Auto. Beispiel Queries - Wenn für ein Auto die Räder geholt werden müssen:
Möglichkeit 1:
select r from Auto a join a.rs r where a.name = x
Möglichkeit 2:
select r from Rad r join r.auto a where a.name=n















