nicht - statische methoden java




Java: Statische Klasse? (5)

Es hat keinen Sinn, die Klasse als static deklarieren. Erklären Sie einfach ihre Methoden static und rufen Sie sie wie die Java-Klasse java.lang.Math vom normalen Klassennamen ab.

Auch wenn es nicht unbedingt notwendig ist, den Konstruktor privat zu machen, ist es eine gute Idee, dies zu tun. Das Markieren des Konstruktors private verhindert, dass andere Personen Instanzen Ihrer Klasse erstellen und dann statische Methoden von diesen Instanzen aufrufen. (Diese Aufrufe funktionieren in Java genau gleich, sie sind nur irreführend und beeinträchtigen die Lesbarkeit Ihres Codes.)

Ich habe eine Klasse voller Utility-Funktionen. Das Instanziieren einer Instanz macht keinen semantischen Sinn, aber ich möchte immer noch seine Methoden aufrufen. Was ist der beste Weg, damit umzugehen? Statische Klasse? Abstrakt?


Klingt so, als hätten Sie eine Utility-Klasse ähnlich wie java.lang.Math .
Der Ansatz dort ist die finale Klasse mit privaten Konstruktoren und statischen Methoden.

Aber hüte dich vor dem, was dies für die Testbarkeit tut, ich empfehle diesen Artikel zu lesen
Statische Methoden sind testbeständig


Laut dem großartigen Buch "Effective Java" :

Punkt 4: Erzwingen Sie Nichteinhaltbarkeit mit einem privaten Konstruktor

- Der Versuch, die Nichtinstantiziabilität durch Erstellen einer Klassenzusammenfassung zu erzwingen, funktioniert nicht.

- Ein Standardkonstruktor wird nur generiert, wenn eine Klasse keine expliziten Konstruktoren enthält. Daher kann eine Klasse durch Einfügen eines privaten Konstruktors nicht instantiierbar gemacht werden:

// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

Da der explizite Konstruktor privat ist, ist er außerhalb der Klasse nicht zugänglich. Der AssertionError ist nicht unbedingt erforderlich, aber er stellt eine Versicherung bereit, falls der Konstruktor versehentlich innerhalb der Klasse aufgerufen wird. Es garantiert, dass die Klasse unter keinen Umständen instanziiert wird. Dieses Idiom ist leicht kontraintuitiv, da der Konstruktor ausdrücklich bereitgestellt wird, so dass er nicht aufgerufen werden kann. Es ist daher ratsam, einen Kommentar hinzuzufügen, wie oben gezeigt.

Als Nebeneffekt verhindert dieses Idiom auch, dass die Klasse unterklassifiziert wird. Alle Konstruktoren müssen explizit oder implizit einen Superklassenkonstruktor aufrufen, und eine Unterklasse hat keinen zugänglichen Superklassenkonstruktor zum Aufrufen.


Nur um stromaufwärts zu schwimmen, nehmen statische Mitglieder und Klassen nicht an OO teil und sind daher böse. Nein, nicht böse, aber ernsthaft, ich würde eine reguläre Klasse mit einem Singleton-Muster für den Zugriff empfehlen. Auf diese Weise, wenn Sie das Verhalten in jedem Fall auf der Straße überschreiben müssen, ist es keine große Umrüstung. OO ist dein Freund :-)

Mein $ .02


  • Final Class und private Konstruktor (gut, aber nicht notwendig)
  • Öffentliche statische Methoden




utility