370 Stimmen

Wie lassen sich Konstanten am besten in Java implementieren?

Ich habe solche Beispiele gesehen:

public class MaxSeconds {
   public static final int MAX_SECONDS = 25;
}

und nahm an, dass ich eine Klasse Constants haben könnte, um Konstanten darin zu verpacken und sie als static final zu deklarieren. Ich weiß praktisch kein Java überhaupt und frage mich, ob dies der beste Weg, um Konstanten zu erstellen ist.

18voto

albus.ua Punkte 261

Ich verwende folgenden Ansatz:

public final class Constants {
  public final class File {
    public static final int MIN_ROWS = 1;
    public static final int MAX_ROWS = 1000;

    private File() {}
  }

  public final class DB {
    public static final String name = "oups";

    public final class Connection {
      public static final String URL = "jdbc:tra-ta-ta";
      public static final String USER = "testUser";
      public static final String PASSWORD = "testPassword";

      private Connection() {}
    }

    private DB() {}
  }

  private Constants() {}
}

Dann verwende ich zum Beispiel Constants.DB.Connection.URL um konstant zu werden. Für mich sieht es eher "objektorientiert" aus.

17voto

Kevin Day Punkte 15662

Die Erstellung statischer endgültiger Konstanten in einer separaten Klasse kann zu Problemen führen. Der Java-Compiler wird dies optimieren und den tatsächlichen Wert der Konstante in jeder Klasse platzieren, die auf sie verweist.

Wenn Sie später die Klasse "Konstanten" ändern und andere Klassen, die auf diese Klasse verweisen, nicht neu kompilieren, werden Sie am Ende eine Kombination aus alten und neuen Werten verwenden.

Betrachten Sie diese nicht als Konstanten, sondern als Konfigurationsparameter und erstellen Sie eine Klasse, um sie zu verwalten. Lassen Sie die Werte nicht endgültig sein, und erwägen Sie sogar die Verwendung von Gettern. Wenn Sie in Zukunft feststellen, dass einige dieser Parameter tatsächlich vom Benutzer oder Administrator konfigurierbar sein sollten, wird dies viel einfacher zu bewerkstelligen sein.

13voto

Yann Ramin Punkte 32375

Der größte Fehler, den Sie machen können, ist die Erstellung einer global zugänglichen Klasse mit einem generischen Namen wie Constants. Dies wird einfach mit Müll überhäuft und Sie verlieren jegliche Fähigkeit herauszufinden, welcher Teil Ihres Systems diese Konstanten verwendet.

Stattdessen sollten Konstanten in die Klasse aufgenommen werden, der sie "gehören". Haben Sie eine Konstante namens TIMEOUT? Sie sollte wahrscheinlich in Ihre Klasse Communications() oder Connection() aufgenommen werden. MAX_BAD_LOGINS_PER_HOUR? Gehört in User(). Und so weiter und so fort.

Die andere mögliche Verwendung sind Java .properties-Dateien, wenn "Konstanten" zur Laufzeit definiert werden können, aber nicht leicht vom Benutzer geändert werden können. Sie können diese in Ihren .jars verpacken und sie mit dem Class resourceLoader referenzieren.

6voto

Jason Cohen Punkte 78227

Das ist der richtige Weg.

Generell sind Konstanten no in separaten "Konstanten"-Klassen aufbewahrt werden, da sie nicht auffindbar sind. Wenn die Konstante für die aktuelle Klasse relevant ist, hilft es dem nächsten Entwickler, sie dort aufzubewahren.

5voto

Ich ziehe es vor, Getter statt Konstanten zu verwenden. Diese Getter können konstante Werte zurückgeben, z. B. public int getMaxConnections() {return 10;} aber alles, was die Konstante benötigt, wird über einen Getter laufen.

Ein Vorteil ist, dass Sie, wenn Ihr Programm über die Konstante hinauswächst - wenn Sie feststellen, dass sie konfigurierbar sein muss - einfach ändern können, wie der Getter die Konstante zurückgibt.

Ein weiterer Vorteil ist, dass man nicht alles, was die Konstante verwendet, neu kompilieren muss, um sie zu ändern. Wenn Sie auf ein statisches endgültiges Feld verweisen, wird der Wert dieser Konstante in jeden Bytecode kompiliert, der auf sie verweist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X