2012-08-25 4 views
7

Angenommen, Sie haben die FileReader-Klasse mit einer read-Methode.Do-er-Klassen im Vergleich zu statischen Hilfsmethoden

Ich verstehe, dass Attribute auf Klassenebene eine Instanz rechtfertigen können. Was hört jedoch auf, eine äquivalente ReaderUtils Klasse zu machen, indem diese gleichen Attribute in den Rahmen einer entsprechenden staticread Methode gezogen werden?

Kurz gesagt, was genau rechtfertigt eine "Doer" -Klasse in Bezug auf statische Utility-Methoden?

+4

Nichts hält jemanden davon ab, ein äquivalentes 'ReaderUtils' zu erstellen, tatsächlich ist es in der JRE implementiert: [' Files.readAllLines'] (http://docs.oracle.com/javase/7/docs/api /java/nio/file/Files.html#readAllLines%28java.nio.file.Path,%20java.nio.charset.Charset%29). – Jeffrey

Antwort

2

Die Essenz von OOP ist die Kapselung von Status/Daten zusammen mit dem zugehörigen Verhalten. Statische Hilfsmethoden ähneln globalen Funktionen in einer prozeduralen Sprache - Sie trennen das Verhalten (die statische Methode) vom Zustand (den Parametern dieser Methode), wodurch die Kapselung aufgehoben wird.

Was bedeutet das in der Praxis? Statt reader.read() anrufen zu können, müssen Sie ReaderUtils.read(file) anrufen, was bedeutet, dass Sie jetzt eng mit der Implementierung verbunden sind - Sie haben eine implizite Annahme gemacht, dass Sie immer ReaderUtils verwenden und immer eine Datei übergeben werden.

Wenn Sie stattdessen die allgemeine Reader Schnittstelle verwenden, können Sie eine FileReader heute verwenden, aber es tauschen für einen DatabaseReader oder HttpReader morgen ohne einen anderen Code ändern zu müssen - alle reader.read() Anrufe werden weiterhin die gleiche Arbeit.

2

Schnittstellen können nicht statisch implementiert werden - die implementierten Methoden einer Schnittstelle müssen Instanz Methoden sein. Als solches verbietet dies injection oder JNDI Nachschlagen einer "Dienstklasse" als die Laufzeit-Implementierung, um einen Dienst durchzuführen - es muss eine Instanz einer Klasse sein. Dies ist einer der Hauptgründe, warum "Doer" -Klassen existieren.

Hilfsklassen sind in Ordnung, wenn die Implementierung zum Zeitpunkt der Kompilierung bekannt ist. Da statische Methoden eher statisch sind, stellen Sie sicher, dass alle statischen Felder unveränderlich/zustandslos sind. Dies wird von typischen Servern verlangt Anfragen gleichzeitig.

1

Es ist eine Frage der Präferenz. Im Allgemeinen favorisiert Java Substantive (weil die Leute denken, dass dies mehr OO ist), also FileReader.

Wie von Jeffrey erwähnt, führt die Nomen-Obsession manchmal zu unnötiger Ausführlichkeit, bei der Aufrufe in statische Methoden verpackt werden.

+1

Nicht 100% relevant, aber das erinnert mich daran, wie die Leute Fabriken so sehr in Java lieben ... http://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/server/RequestProcessorFactoryFactory – Mehrdad

Verwandte Themen