Wenn Sie mit Java-Programmen auf Benutzeroberflächenbasis arbeiten, können Sie bestimmten Aktionen (z. B. einem Klick auf eine Schaltfläche) Verhalten hinzufügen, indem Sie anonyme Klassen verwenden. Im folgenden Beispiel ist das GUI-Framework SWT, ich habe jedoch dieselben Probleme mit Swing- oder Android-UI-Komponenten. Nämlich die Strukturierung meiner Programme.
MenuItem sampleMenuItem = new MenuItem(popupMenu, SWT.NONE);
sampleMenuItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
doSomething();
// handle all table entries
for (int i=0; i<10; i++) {
doSomething2();
}
doSomething3();
doSomething4();
}
});
Natürlich könnten einige argumentieren, dass die Menge an Code im obigen Beispiel bereits die Erstellung einer dedizierten Klasse rechtfertigt, die die Logik enthält. Dies wird auch von Sonars Regel "Anonyme Klassen sollten nicht zu viele Zeilen haben" vorgeschlagen .
Interessanterweise legt diese Regel auch Folgendes fest:
squid: S1188 - Während Sie auf die Unterstützung des Abschlusses in Java warten, sind anonyme Klassen die bequemste Möglichkeit, ein Verhalten einzufügen, ohne eine dedizierte Klasse erstellen zu müssen. Diese anonymen inneren Klassen sollten jedoch nur verwendet werden, wenn das Verhalten in wenigen Zeilen ausgeführt werden kann. Bei komplexerem Code wird eine benannte Klasse benötigt.
Da die Schließungen in Java jedoch noch nicht angekommen sind, ist meine Frage, ob es elegantere Lösungen gibt als :
- Schreiben einer Reihe von Code in anonymen Klassen mit allen möglichen Nachteilen (eingeschränkte Wiederverwendung, langsameres Navigieren durch den Code, ...)
- Erstellen einer großen Anzahl dedizierter Klassen, die selbst möglicherweise nur über sehr eingeschränkte Funktionen verfügen (z. B. Überentwicklung, ...)
Um meine Frage zu erweitern: Ich möchte auch wissen, was die Best Practices in Bezug auf diesen Aspekt von Java-basierten UI-Anwendungen sind. Gibt es gut etablierte Muster?