Nehmen wir an, ich möchte einige Dienstprogrammfunktionen erstellen, um einige grundlegende Berechnungen mit dem BigDecimal
s durchzuführen. Beispielsweise möchte ich eine Funktion haben, die den Durchschnitt von a berechnet List<BigDecimal>
.
Was ist der beste Ansatz? Eine statische Funktion oder eine Utility-Klasse?
public static BigDecimal computeAverage(List<BigDecimal> numbers)
oder
public class BigDecimalUtil
public computeAverage(List<BigDecimal> numbers)
Antworten:
Ich werde meine C # -Lehnungen wahrscheinlich auf die schlechteste Art und Weise verraten, aber ich würde immer statische Methoden innerhalb von Utility-Klassen empfehlen. Dies gibt Ihnen das Beste aus beiden Welten. Die organisatorischen Vorteile der Klasse durch die Verwendbarkeit von Methoden, auf die zugegriffen wird, ohne dass ein Objekt instanziiert werden muss, um sie zu verwenden. Wenn Ihre Utility-Klasse einen Grund hat, ihr Verhalten gelegentlich zu ändern, sind Sie bereits gut positioniert, indem Sie später Vererbung / Schnittstellen einführen, falls dies erforderlich sein sollte. Wenn Sie möchten, dass Ihr Design etwas portabler ist, lässt sich das Paradigma leichter auf andere OO-Sprachen übertragen.
quelle
Wenn Sie Dienstprogrammfunktionen ausführen möchten, die durch ein bestimmtes Thema verbunden sind, erstellen Sie eine Klasse für sie, machen Sie sie in dieser Klasse statisch und machen Sie einen Konstruktor dieser Klasse privat, um die Möglichkeit eines versehentlichen Ausgebens einer Instanz auszuschließen. Verwenden Sie also die zweite Variante, aber verstecken Sie den Konstruktor.
Es gibt noch eine Möglichkeit - keinen Konstruktor zu erstellen und diese Klasse abstrakt zu machen. Auf diese Weise können Sie die Instanz der Klasse jedoch nicht nur außerhalb, sondern auch innerhalb der Klasse verwenden. Ich denke, diese zweite Variante ist zu streng für dich. Wähle dich selbst.
quelle
Ich stimme @Gangnus zu, dass eine statische "Wrapper" -Klasse sinnvoll ist, wenn einzelne Klassenmethoden immer isoliert verwendet werden, und dies wird oft eine gute Antwort sein.
In einer nicht statischen Klasse mit nicht statischen Methoden kann jedoch ein Wert vorhanden sein, wenn Sie verwandte Berechnungen haben, die wahrscheinlich zusammen verwendet werden. Zum Beispiel bauen ein
ListStatsUtil
Objekt mitList<BigDecimal>
in Konstruktor übergeben, könnte es für den Zugriff bequem seingetStandardDeviation
,getVariance
undgetAverage
der Reihe nach, ohne zurück in das Objekt übergeben. Dies ist möglicherweise eleganter, bietet jedoch möglicherweise auch eine bessere Leistung, insbesondere wenn rechenintensive Vorgänge erforderlich sind, die betriebsübergreifend optimiert werden können, indem der private Status innerhalb des Objekts gemeinsam genutzt wird.quelle
super()
im privaten Konstruktor für eine statische Klasse in Java sinnvoll?Ich habe für die Codingoutloud-Antwort gestimmt und möchte sie ein wenig erweitern.
Das Verpacken von Sammlungen in Klassen ist etwas, was ich immer versucht habe - meine Regel lautet "Übergeben Sie niemals eine nackte Sammlung". Der größte Fehler von OO, den ich gesehen habe, ist, wenn Leute Angst haben, Methoden hinzuzufügen, wo sie hingehören. In Ihrem Fall gehören die Methoden zur Sammlung (ganz offensichtlich, wenn Sie darüber nachdenken). Legen Sie sie also dort ab, indem Sie die Sammlung einpacken. Um das Sahnehäubchen auf den Kuchen zu setzen, legen Sie nur die Funktionen offen, die Sie außerhalb Ihrer neuen Klasse benötigen (als Codingoutloud) tat), damit Sie sich Ihre einzelne, kleine Klasse ansehen und leicht verstehen können, was diese Sammlung manipuliert.
Sie müssen nicht jedes mögliche Problem lösen, da es sich nur um Ihren Code handelt. Sie können den Sammlungs-Wrapper genauso einfach bearbeiten wie die anderen Klassen, die mit ihm interagieren. Auf diese Weise können Sie bei Bedarf anderen Code in die Klasse ziehen. Wenn Sie die Auflistung nie verfügbar machen, wird schnell klar, welcher Code zum Wrapper gehört.
Auf diese Weise haben Sie auch die vollständige Kontrolle über die Sammlung, sodass Sie verhindern können, dass sie in einen Zustand versetzt wird, der nicht mit ihrer Funktion übereinstimmt. Wenn beispielsweise kein Eintrag in der Sammlung null sein kann, verhindern Sie einfach, dass jemand eine Null einfügt!)
Der größte Teil des fehlerhaften OO-Codes, den ich je gesehen habe, wurde erstellt, weil jemand statische Dienstprogramme oder Inline-Code geschrieben hat, der zu Objekten gehört, zu denen er keinen Code hinzufügen konnte, anstatt die fehlerhaften Objekte in eigenen Code zu verpacken, den er ändern konnte .
quelle
Wenn ich mich nicht irre und Java eine reine OO-Sprache ist, können Sie keine Funktionen haben, ohne sie in eine Klasse einzuschließen.
Ihre Antwort lautet also: beides, eine statische Funktion, die in eine statische Dienstprogrammklasse eingeschlossen ist, ähnlich wie die Math-Klasse.
quelle
Wie wäre es mit einer CalcAverageStrategy-Schnittstelle, die injiziert wird, und Sie können dann bei Bedarf Mean / Median / Mode-Implementierungen injizieren lassen.
Jede Implementierung ist einfach zu testen und auch zum Testen leicht zu verspotten.
quelle