Java von den Grundlagen bis zum Profi — Folge 5
Wählen Sie Generika und Kollektionen, die zu Ihrem Zweck passen
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Java-Sammlungen speichern eine Vielzahl von Daten, aber jede Datenstruktur führt unterschiedliche Aufgaben aus. Wenn Sie Generics zusammen verwenden, können Sie beim Kompilieren nach Typfehlern suchen, ohne den abgerufenen Wert jedes Mal konvertieren zu müssen.
List, Set, Map
List<String> party = new ArrayList<>();
Set<Integer> unlockedIds = new HashSet<>();
Map<Integer, Item> itemById = new HashMap<>();
party.add("Rose");
unlockedIds.add(10);
itemById.put(10, new Item(10, "Potion"));
List ermöglicht Reihenfolge und Duplizierung, und Set befasst sich mit dem Vorhandensein oder Fehlen nichtduplizierter Werte. Map findet Werte über Schlüssel.
Die Reihenfolge von HashMap ist nicht garantiert. Wenn es sich bei der Sortier- oder Eingabereihenfolge um einen Vertrag handelt, sollten Sie eine Implementierung wählen, die diesem Zweck entspricht.
Sicher suchen
Item item = itemById.get(10);
if (item != null) {
System.out.println(item.getName());
}
get gibt null zurück, wenn der Schlüssel nicht existiert. Durch die Vermeidung von Designs, die Null selbst als Wert speichern, wird eine Verwechslung zwischen None und dem Nullwert vermieden.
generische Klasse
public final class Registry<T extends Identifiable> {
private final Map<Integer, T> values = new HashMap<>();
public void add(T value) {
values.put(value.getId(), value);
}
public Optional<T> find(int id) {
return Optional.ofNullable(values.get(id));
}
}
T extends Identifiable ist eine Einschränkung, dass der zu speichernde Typ eine ID bereitstellen muss. Registry<Item> und Registry<Monster> verwenden dieselben Regeln wieder, aber die Werte werden nicht gemischt.
Verlassen Sie sich auf Schnittstellen statt auf Implementierungen
Wenn Sie die Feld- und Parametertypen auf eine Listen- oder Kartenschnittstelle festlegen, verbleiben nur die erforderlichen Vorgänge im Vertrag. Wenn jedoch Leistungsmerkmale wichtig sind, sollten Sie auch wissen, ob die tatsächliche Implementierung ArrayList oder LinkedList ist.
Die Auswahl einer Sammlung ist nicht nur eine Frage der Datenmenge. Zunächst muss der Verwendungszweck wie Reihenfolge, Vervielfältigung, Suchschlüssel und Änderungshäufigkeit ermittelt werden.