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.

402voto

jjnguy Punkte 132790

Das ist durchaus akzeptabel, wahrscheinlich sogar der Standard.

(public/private) static final TYPE NAME = VALUE;

wobei TYPE ist der Typ, NAME ist der Name in Großbuchstaben mit Unterstrichen für Leerzeichen, und VALUE ist der konstante Wert;

Ich empfehle dringend, Ihre Konstanten NICHT in eigene Klassen oder Schnittstellen zu integrieren.

Nebenbei bemerkt: Variablen, die als endgültig deklariert und veränderbar sind, können immer noch geändert werden; allerdings kann die Variable niemals auf ein anderes Objekt zeigen.

Zum Beispiel:

public static final Point ORIGIN = new Point(0,0);

public static void main(String[] args){

    ORIGIN.x = 3;

}

Das ist legal und ORIGIN wäre dann ein Punkt bei (3, 0).

234voto

MetroidFan2002 Punkte 28293

Ich würde dringend davon abraten, eine einzige Konstantenklasse zu haben. Das mag im ersten Moment eine gute Idee sein, aber wenn Entwickler sich weigern, Konstanten zu dokumentieren, und die Klasse auf über 500 Konstanten anwächst, die alle überhaupt nichts miteinander zu tun haben (da sie sich auf völlig unterschiedliche Aspekte der Anwendung beziehen), führt das in der Regel dazu, dass die Konstanten-Datei völlig unlesbar wird. Stattdessen:

  • Wenn Sie Zugang zu Java 5+ haben, verwenden Sie Enums, um Ihre spezifischen Konstanten für einen Anwendungsbereich zu definieren. Alle Teile des Anwendungsbereichs sollten auf Enums und nicht auf konstante Werte für diese Konstanten verweisen. Sie können ein Enum ähnlich wie eine Klasse deklarieren. Enums sind vielleicht die nützlichste (und wohl auch einzige) Funktion von Java 5+.
  • Wenn Sie Konstanten haben, die nur für eine bestimmte Klasse oder eine ihrer Unterklassen gültig sind, deklarieren Sie sie entweder als geschützt oder öffentlich und platzieren Sie sie in der obersten Klasse der Hierarchie. Auf diese Weise können die Unterklassen auf diese Konstantenwerte zugreifen (und wenn andere Klassen über public auf sie zugreifen, sind die Konstanten nicht nur für eine bestimmte Klasse gültig... was bedeutet, dass die externen Klassen, die diese Konstante verwenden, möglicherweise zu eng an die Klasse gekoppelt sind, die die Konstante enthält)
  • Wenn Sie eine Schnittstelle mit definiertem Verhalten haben, aber die zurückgegebenen Werte oder Argumentwerte besonders sein sollen, ist es durchaus akzeptabel, Konstanten auf dieser Schnittstelle zu definieren, so dass andere Implementierer Zugang zu ihnen haben. Vermeiden Sie es jedoch, eine Schnittstelle nur zur Aufnahme von Konstanten zu erstellen: Sie kann genauso schlecht werden wie eine Klasse, die nur zur Aufnahme von Konstanten erstellt wurde.

120voto

Marcio Aguiar Punkte 13577

Es ist ein SCHLECHTE PRAXIS Schnittstellen nur zur Aufnahme von Konstanten zu verwenden (namens Konstantes Schnittstellenmuster von Josh Bloch). Hier ist, was Josh rät:

Wenn die Konstanten stark an eine bestehende Klasse oder Schnittstelle, sollten Sie sollten Sie sie zu der Klasse oder Schnittstelle hinzufügen. Zum Beispiel, alle der boxed numerischen primitiven Klassen, wie Integer und Double, exportieren MIN_VALUE und MAX_VALUE Konstanten. Wenn sind die Konstanten am besten als Mitglieder einer Aufzählung sollten Sie sie mit einer enum Art. Andernfalls sollten Sie die Konstanten mit einer nicht-instanziellen Hilfsklasse exportieren.

Exemple :

// Constant utility class
package com.effectivejava.science;
public class PhysicalConstants {
    private PhysicalConstants() { }  // Prevents instantiation

    public static final double AVOGADROS_NUMBER   = 6.02214199e23;
    public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
    public static final double ELECTRON_MASS      = 9.10938188e-31;
}

Über die Namenskonvention:

Der Konvention nach haben solche Felder die Namen bestehend aus Großbuchstaben, mit Wörtern, die durch Unterstriche getrennt sind. Es ist entscheidend, dass diese Felder Folgendes enthalten entweder primitive Werte oder Verweise auf unveränderliche Objekte enthalten.

36voto

shelfoo Punkte 1579

In Effective Java (2. Auflage) wird empfohlen, enums anstelle von statischen ints für Konstanten zu verwenden.

Es gibt eine gute Beschreibung von Enums in Java hier: http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html

Am Ende des Artikels wird die folgende Frage gestellt:

Wann sollten Sie also Enums verwenden?

Mit einer Antwort von:

Jedes Mal, wenn Sie einen festen Satz von Konstanten benötigen

21voto

Vermeiden Sie einfach die Verwendung einer Schnittstelle:

public interface MyConstants {
    String CONSTANT_ONE = "foo";
}

public class NeddsConstant implements MyConstants {

}

Das ist verlockend, verletzt aber die Kapselung und verwischt die Unterscheidung der Klassendefinitionen.

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