Ereignisse und Updates 24.00
Repository
-Ereignisse ermöglichen es Ihnen, auf Datenänderungen zu reagieren. Neben den automatischen UI-Updates können Sie Änderungen überwachen, um benutzerdefinierte Logik auszulösen.
Repository
-Ereignislebenszyklus
Jeder commit()
-Aufruf löst ein RepositoryCommitEvent
aus. Dieses Ereignis trägt Informationen darüber, was sich geändert hat:
repository.onCommit(event -> {
// Alle eingereichten Entitäten abrufen
List<Customer> commits = event.getCommits();
// Überprüfen, ob es sich um ein Update einer einzelnen Entität handelt
if (event.isSingleCommit()) {
Customer updated = event.getFirstCommit();
System.out.println("Aktualisiert: " + updated.getName());
}
});
Das Ereignis teilt Ihnen mit:
getCommits()
- Liste der eingereichten EntitätenisSingleCommit()
- Ob es sich um ein gezieltes Update einer einzelnen Entität handeltgetFirstCommit()
- Bequemlichkeitsmethode, um die erste (oder einzige) Entität abzurufen
Für commit()
ohne Parameter enthält das Ereignis alle Entitäten, die sich nach der Filterung derzeit im Repository befinden.
Update-Strategien
Die beiden Commit-Signaturen dienen unterschiedlichen Zwecken:
// Update einer einzelnen Entität - effizient für individuelle Änderungen
Customer customer = customers.get(0);
customer.setStatus("VIP");
repository.commit(customer);
// Bulk-Update - effizient für mehrere Änderungen
products.clear();
products.addAll(loadProductsFromCsv());
repository.commit();
Commits für einzelne Entitäten sind chirurgisch - sie teilen den verbundenen Komponenten genau mit, welche Zeile sich geändert hat. Der Table
kann nur die Zellen dieser Zeile aktualisieren, ohne etwas anderes zu berühren.
Bulk-Commits aktualisieren alles. Verwenden Sie sie, wenn:
- Mehrere Entitäten sich geändert haben
- Sie Elemente hinzugefügt oder entfernt haben
- Sie sich nicht sicher sind, was sich geändert hat
Reaktive UI-Muster
Repository
-Ereignisse ermöglichen es Ihnen, Zusammenfassungsanzeigen mit Ihren Daten synchron zu halten:
// Automatisch aktualisierende Labels
repository.onCommit(event -> {
double total = sales.stream().mapToDouble(Sale::getAmount).sum();
totalLabel.setText(String.format("Gesamt: $%.2f", total));
countLabel.setText("Verkäufe: " + sales.size());
});
// Aktuelle Ergebniszahlen
repository.onCommit(e -> {
long count = repository.findAll().count();
resultsLabel.setText(count + " Produkte gefunden");
});
Diese Listener werden bei jedem Commit ausgelöst, unabhängig davon, ob es sich um Benutzeraktionen, Datenimporte oder programmatische Updates handelt. Das Ereignis gibt Ihnen Zugriff auf die eingereichten Entitäten, aber oft werden Sie die Berechnung aus der Quellsammlung neu durchführen, um alle aktuellen Daten einzubeziehen.
Speichermanagement
Ereignis-Listener halten Referenzen auf Ihre Komponenten. Wenn Sie sie nicht entfernen, behält das Repository
Ihre Komponenten im Speicher, selbst nachdem sie nicht mehr angezeigt werden:
// Referenz behalten, um sie später zu entfernen
ListenerRegistration<RepositoryCommitEvent<Data>> registration =
repository.onCommit(event -> {
updateDisplay(event.getCommits());
});
// Listener bereinigen, wenn die Komponente zerstört wird
if (registration != null) {
registration.remove();
}
Die Methode onCommit()
gibt eine ListenerRegistration
zurück. Bewahren Sie diese Referenz auf und rufen Sie remove()
auf, wenn Ihre Komponente zerstört wird oder keine Updates mehr benötigt. Dies verhindert Speicherlecks in langfristig laufenden Anwendungen.