Ich habe eine Klasse, die nur aus statischen Elementvariablen und statischen Methoden besteht. Im Wesentlichen dient es als allgemeine Dienstprogrammklasse.
Ist es eine schlechte Praxis für eine Klasse, nur statische Elementvariablen und statische Methoden zu enthalten?
java.lang.Math
ist 100% statische Methoden mit einemprivate
Konstruktor (kann nicht instanziiert werden).Antworten:
Nein, das glaube ich überhaupt nicht. Es ist schlimmer, eine Klasse voller Instanzmethoden zu haben, die nicht wirklich von einer bestimmten Instanz abhängen. Wenn Sie sie statisch machen, erfahren Sie genau, wie sie verwendet werden sollen. Außerdem vermeiden Sie auf diese Weise unnötige Instanziierungen.
EDIT: Nachträglich finde ich es im Allgemeinen schön, die Verwendung von Sprachfunktionen "nur weil" zu vermeiden, oder weil Sie denken, dass dies die "Java-Methode" ist. Ich erinnere mich an meinen ersten Job, bei dem ich eine Klasse voller statischer Dienstprogrammmethoden hatte und einer der leitenden Programmierer mir sagte, dass ich die OO-Leistung von Java nicht vollständig nutzen konnte, indem ich alle meine Methoden "global" machte. Sie war 6 Monate später nicht im Team.
quelle
Solange die Klasse keinen internen Status hat und im Wesentlichen eine sogenannte Blattklasse ist (Dienstprogrammklassen fallen in diese Kategorie), ist sie mit anderen Worten unabhängig von anderen Klassen. Es ist in Ordnung.
Die
Math
Klasse ist ein Paradebeispiel.quelle
Klingt vernünftig.
Hinweis: Klassen, die dies tun, haben häufig einen privaten Konstruktor ohne Argumente, nur damit der Compiler einen Fehler ausgibt, wenn ein Programmierer versucht, eine Instanz der statischen Klasse zu erstellen.
quelle
Statische Methoden machen mir keine großen Sorgen (außer zum Testen).
Im Allgemeinen sind statische Elemente ein Problem. Was ist zum Beispiel, wenn Ihre App geclustert ist? Was ist mit der Startzeit - welche Art von Initialisierung findet statt? Weitere Informationen zu diesen und weiteren Themen finden Sie in diesem Artikel von Gilad Bracha.
quelle
Es ist völlig vernünftig. Tatsächlich können Sie in C # eine Klasse mit dem statischen Schlüsselwort speziell für diesen Zweck definieren.
quelle
Lass dich einfach nicht mitreißen. Beachten Sie, dass es in der Klasse java.lang.Math nur um mathematische Funktionen geht. Möglicherweise verfügen Sie auch über eine StringUtilities-Klasse, die allgemeine Funktionen zur Behandlung von Zeichenfolgen enthält, die beispielsweise nicht in der Standard-API enthalten sind. Wenn Ihre Klasse beispielsweise Utilities heißt, ist dies ein Hinweis darauf, dass Sie sie möglicherweise aufteilen möchten.
quelle
Beachten Sie auch, dass Java speziell den statischen Import eingeführt hat: ( http://en.wikipedia.org/wiki/Static_import )
quelle
Ich stimme zwar dem Gefühl zu, dass es sich nach einer vernünftigen Lösung anhört (wie andere bereits festgestellt haben), aber eine Sache, die Sie in Betracht ziehen sollten, ist aus gestalterischer Sicht, warum Sie eine Klasse nur für "Nutzen" -Zwecke haben. Sind diese Funktionen im gesamten System wirklich allgemein oder beziehen sie sich wirklich auf eine bestimmte Klasse von Objekten in Ihrer Architektur?
Solange Sie darüber nachgedacht haben, sehe ich kein Problem mit Ihrer Lösung.
quelle
Die Collections- Klasse in Java SDK hat nur statische Mitglieder.
Also los, solange Sie die richtige Rechtfertigung haben - es ist kein schlechtes Design
quelle
Dienstprogrammmethoden werden häufig in Klassen mit nur statischen Methoden (wie z
StringUtils
. B. ) platziert. Globale Konstanten werden auch in ihrer eigenen Klasse platziert, damit sie vom Rest des Codes (public final static
Attribute) importiert werden können .Beide Verwendungen sind weit verbreitet und verfügen über private Standardkonstruktoren, um zu verhindern, dass sie instanziiert werden. Das Deklarieren des Klassenfinales verhindert den Fehler, statische Methoden zu überschreiben.
Wenn
static member variables
Sie damit nicht globale Konstanten gemeint haben, möchten Sie möglicherweise die Methoden, die auf diese Variablen zugreifen, in eine eigene Klasse einfügen. Könnten Sie in diesem Fall erläutern, was diese Variablen in Ihrem Code bewirken?quelle
Auf diese Weise werden normalerweise Dienstprogrammklassen entworfen, und daran ist nichts auszusetzen. Berühmte Beispiele sind
o.a.c.l.StringUtils
,o.a.c.d.DbUtils
,o.s.w.b.ServletRequestUtils
etc.quelle
Nach einer starren Interpretation des objektorientierten Designs ist eine Gebrauchsklasse zu vermeiden.
Das Problem ist, dass Sie, wenn Sie einer starren Interpretation folgen, Ihre Klasse in ein Sortierobjekt zwingen müssen, um viele Dinge zu erreichen.
Sogar die Java-Designer erstellen Dienstprogrammklassen (java.lang.Math fällt mir ein)
Ihre Optionen sind:
vs:
Selbst wenn wir die ausführliche Methode vermeiden würden, könnten wir dennoch Folgendes erreichen:
In diesem Fall ist .sqrt () immer noch statisch. Worum geht es also bei der Erstellung des Objekts überhaupt?
Die Antwort lautet: Erstellen Sie Dienstprogrammklassen, wenn Ihre andere Option darin besteht, eine künstliche "Worker" -Klasse zu erstellen, die beispielsweise keine oder nur geringe Verwendung von Variablen hat.
quelle
Dieser Link http://java.dzone.com/articles/why-static-bad-and-how-avoid scheint den meisten Antworten hier zu widersprechen. Selbst wenn es keine Mitgliedsvariablen enthält (dh keinen Status), kann eine statische Klasse immer noch eine schlechte Idee sein, da sie nicht verspottet oder erweitert (unterklassifiziert) werden kann und daher einige der Prinzipien von OO zunichte macht
quelle
Ich würde mir keine Sorgen um eine Utility-Klasse machen, die statische Methoden enthält.
Statische Elemente sind jedoch im Wesentlichen globale Daten und sollten vermieden werden. Sie können akzeptabel sein, wenn sie zum Zwischenspeichern von Ergebnissen der statischen Methoden und dergleichen verwendet werden, aber wenn sie als "echte" Daten verwendet werden, die zu allen Arten von Problemen führen können, wie versteckten Abhängigkeiten und Schwierigkeiten beim Einrichten von Tests.
quelle