Java / Android: anonyme lokale Klassen vs benannte Klassen

8

Ich möchte fragen, was ist die gute Praxis bei der Verwendung von anonymen Klassen vs. benannten inneren Klassen?

Ich schreibe eine Android-Anwendung, die viele UI-Elemente (Schaltflächen, Textfelder usw.) enthält. Für viele von ihnen brauche ich irgendeine Art von Zuhörern, also in onCreate der Anwendung habe ich Haufen recht kleiner anonymer Klassen wie:

%Vor%

Jede dieser anonymen Klassen ist 5 - 20 Zeilen groß - klein genug und passt gut zu den Empfehlungen von Java ™ in Kürze Buch:

  

Im Allgemeinen sollten Sie eine anonyme Klasse anstelle einer lokalen Klasse verwenden, wenn:

     
  • Die Klasse hat einen sehr kurzen Körper.
  •   
  • Nur eine Instanz der Klasse wird benötigt.
  •   
  • Die Klasse wird direkt nach der Definition verwendet.
  •   
  • Der Name der Klasse macht Ihren Code nicht leichter verständlich.
  •   

Aber das Problem, IMO, ist, dass onCreate ziemlich groß wird und der Code komplexer wird, wenn man ihn schnell liest und versteht. Es ist immer noch leicht zu verstehen, aber einfach zu groß.

Was wäre in diesem Fall also eine bessere Übung? - Haben Sie eine Menge kleiner innerer Unterklassen, von denen jede gut getrennt ist, aber nur einmal verwendet wird oder stattdessen anonyme Klassen verwendet?

    
Laimoncijus 26.08.2010, 16:05
quelle

6 Antworten

8

Ich glaube nicht, dass es auf die eine oder andere Weise eine klare Antwort gibt. Beide Stile funktionieren gut, es ist wirklich genau das, was Sie bevorzugen.

Eine andere Option ist

Der Inhalt jedes onClick durch einen einzigen Funktionsaufruf, der die anonymen Klassen sehr kurz hält. Ie:

%Vor%     
Cheryl Simon 26.08.2010, 16:11
quelle
5

Refrazieren Sie die onCreate() in separate Methoden, die nach gemeinsamer Funktionalität gruppiert sind, so dass Sie logische Einheiten haben. Wenn die GUI komplex ist, wird es Ihnen später helfen.

BEARBEITEN:

Da Sie in einer anonymen Klasse standardmäßig durch einen Codeformatter stärker eingerückt sind, müssen Ihre Zeilen kürzer sein, damit der Formatierer sie nicht über mehrere Zeilen verteilt. Dies ist normalerweise die Sache, die deutlich macht, dass es ein guter Zeitpunkt wäre, die Klasse zu extrahieren und ihr einen Namen zu geben.

    
quelle
3

Ich mache Desktop / Swing-Anwendungen, aber ich denke, die Konzepte sind die gleichen.

Ich bevorzuge es, alle Ereignisse in einer Klasse zu behandeln, also erstelle ich eine Controller-Klasse und implementiere alle Listener, die ich in dieser Klasse brauche. Dann erstelle ich für jede Art von Listener eine Methode im Panel. Er fügt den Listener zu jeder Komponente im Panel hinzu, die er anhören muss. Ich übergebe das Panel als erstes Argument an den Konstruktor der Controller-Klasse und lasse es jede dieser Listener-Methoden im Panel aufrufen. Dann instanziiere ich den Controller, wenn ich das Panel instanziiere.

Das gibt mir mehrere Vorteile:

  • Der gesamte Ereignisbehandlungscode ist in einer Klasse.
  • Jede Überkreuzung in der Funktionalität zwischen Ereignissen wird leicht aufgefangen und behandelt.
  • Jeder betroffene Zustand kann in einer Klasse gespeichert und kontrolliert werden.
  • Der gesamte Ereignisbehandlungscode ist vom Komponentenlayoutcode getrennt.
  • Die View-Ebene (Panel) weiß nichts über die Controller-Ebene.

Wenn gesagt wird, dass die Ereignisse, die Sie anhängen, einfache Dinge tun und diese Dinge nicht mit anderen Ereignissen in Konflikt stehen, dann ist es nicht falsch, anonyme Klassen zu verwenden.

    
Erick Robertson 26.08.2010 16:14
quelle
1

Ich weiß nicht, ob es von der Community als Best Practice betrachtet wird, aber wenn diese Art von Klasse zu groß wird, erstelle ich einen Paket-Listener und erstelle meine Klasse darin. Warum sollten Sie eine innere Klasse oder eine anonyme Klasse verwenden, wenn sie später in Ihrem Code in Gefahr ist?

Aber die meiste Zeit, wenn diese Art von Klasse groß wird, liegt es daran, dass Sie nicht genug delegiert haben. Vielleicht sollten andere Klassen Methoden haben, die Ihrem Hörer helfen, leichter zu sein.

    
Colin Hebert 26.08.2010 16:11
quelle
0

Wie das Zitat andeutet, ist dies etwas Subjektives. Sie müssen herausfinden, was als "sehr kurz" und "einfacher zu verstehen" für Sie selbst gilt, um zu bestimmen, an welcher Stelle die Code-Größe die Grenze von etwas, das als anonyme Klasse sinnvoll erscheint, zu etwas macht, das Sinn macht Einheit.

Alle Antworten, die Ihnen jemand geben würde, basieren auf ihren eigenen subjektiven Maßen dafür, was "kurz" ist und wie viele Codezeilen es braucht, um nicht mehr "kurz" zu sein.

    
matt b 26.08.2010 16:10
quelle
0

Sie haben mehrere Vorteile, wenn Sie diese Elemente in benannte Klassen einfügen.

Der erste ist der, den Sie erwähnen - er wird die Methode onCreate () prägnanter und verständlicher machen.

Der zweite ist, dass der Name schnell identifizieren sollte, welche Logik zu welcher Schaltfläche gehört, wodurch der Code gelöscht wird

Das dritte ist eine leichtere Trennung der Aufgaben. Wenn Sie sich für ein IoC-Modell entscheiden, können Sie viel einfacher benannte Implementierungen der Listener einfügen.

    
Matthew Flynn 26.08.2010 16:21
quelle