Frage

Zum Beispiel:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

Persönlich würde ich eher diese Substitutionskonstanten sehen statisch auf Klassenebene deklariert. Ich glaube, ich bin für eine „Industrie Sicht“ auf die Frage suchen.

War es hilfreich?

Lösung

Meine Ausgangsposition ist, dass jede Variable oder Konstante sollte so nah es deklariert / initialisiert werden ist erster Einsatz als möglich / praktische (dh sie einen logischen Code-Block in zwei Hälften nicht brechen, nur ein paar Zeilen näher zu erklären), und scoped so fest wie möglich. -. Es sei denn, du mir einen verdammt guten Grund geben kann, warum sollte es anders sein

Zum Beispiel scoped ein Verfahren Finale wird in der öffentlichen API nicht sichtbar sein. Manchmal wird diese Menge an Informationen verlassen nützlich für die Benutzer Ihrer Klasse werden könnte und sollte nach oben verschoben werden.

Im Beispiel Sie in der Frage gab, würde ich sagen, dass MIN_INTEREST ist wahrscheinlich eines dieser Stücke von Informationen, die ein Benutzer die Hände bekommen möchte, und es sollte auf die Klasse scoped werden, nicht das Verfahren. (Obwohl, gibt es keinen Zusammenhang mit dem Beispiel-Code, und meine Vermutung könnte völlig falsch sein.)

Andere Tipps

Ich würde denken, dass Sie sie nur auf Klassenebene setzen sollten, wenn sie durch mehrere Methoden verwendet werden. Wenn es nur in diesem Verfahren verwendet wird, dann das sieht gut zu mir.

Technisch gibt es nicht so etwas wie eine „Methode konstant scoped“ in Java. Was Sie sich beziehen, ist einfach eine endgültige lokale Variable; es erzeugt ein mit jedem Methodenaufruf zerstört.

http://www.java-tips.org/java-se-tips/java.lang/how-do-i-declare-a-constant-in-java.html

Information versteckt und Modularität sind Schlüsselprinzipien und schmal Scoping ist eine bessere Information zu verbergen. Wenn die Konstante nur durch das Verfahren benötigt wird, ist das Versteck gut. Falls und wenn die Konstante nützlich anderswo ist, bringen sie aus einem breiteren Umfang, aber nur so weit wie nötig.

Sie sind wahrscheinlich betroffen, weil dies eine Konstante ist, und daher kann es scheinen, zu einem gewissen globalen Eigenschaften Tabelle zu gehören. Vielleicht ist es der Fall ist. Vielleicht ist es nicht. Ihr Anliegen ist gültig, aber es gibt keinen besten Platz für alle Konstanten.

Ich habe diese Methode verwendet Konstanten scoped selbst, aber jeder so oft ein Kollege wird nach unten mod es während Code-Reviews. Auch diese Kollegen nicht in Lesen / Open-Source-Schreiben, sondern sie zu Enterprise-Software verwendet werden.

Ich sage ihnen, dass es keinen Sinn macht, eine Klasse Niveau konstant zu verwenden, wenn es in einem einzigen Verfahren verwendet wird, aber ich habe mehr als 1 Kollegen gefunden besteht darauf, dass es nach oben verschoben werden. Ich entsprechen in der Regel, da ich nicht so starr bin es sei denn, es wirkt sich die Lesbarkeit und / oder Leistung.

Ich habe eine andere Meinung dazu: IMHO ist es besser, sie zu platzieren auf Datei / Klassenbereich vor allem, wenn Sie in Teams aus diesem Grunde arbeiten: Sie sagt, mit einem kleinen Stück Code beginnen ...

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}

und andere Mitglieder den Sie ein Team die Klasse mit ganzer Reihe von Methoden erweitern und jetzt die Klasse ist eine wunderbare 500 lines / 50 methods Riesen Klasse. Stellen Sie sich die Erfahrung eines Ingenieurs, um das Hinzufügen einer neuen Methode mit einer konstanten versucht, sie müssen 1 die ganze Klasse Scan für Konstanten suchen, der ihr Bedürfnis entsprechen, 2 die Konstante Klassenbereich bewegen Hoffnung, dass es keine Konflikte mit bestehenden Code und 3 auch ihre Methode hinzufügen.

Wenn Sie stattdessen alle Konstanten auf Datei / Klassenbereich hinzufügen zu beginnen, haben Ingenieure einen 1 einzigen Ort zu suchen vorhandenen Konstanten und 2 ableiten einige Konstanten von anderen, wo es Sinn macht. (Zum Beispiel, wenn Sie eine Konstante für pi Sie auch eine neue Konstante mit einem Wert von pi/2 definieren mögen).

Der Grund, warum Sie eine endgültige Variable auf Klassenebene definieren können oder Verfahren (lokalen) Ebene ist es, weil Sie die globale statische Konstante innerhalb des (lokalen) -Methode außer Kraft setzen können.

Beispiel:

public class Test {

    final double MIN_INTEREST = 0.0;

    /**
     * @param args
     */
    public static void main(String[] args) {


        Test test = new Test();

        test.doSomethingLocal();
        test.doSomethingGlobal();

    }

    public void doSomethingGlobal() {

        System.out.println("Global-> " + MIN_INTEREST);

    }

    public void doSomethingLocal() {

        final double MIN_INTEREST = 0.1;

        System.out.println("Local-> " + MIN_INTEREST);

    }
}

Der Ausgang wird sein:

Local-> 0.1
Global-> 0.0

So Ihre Frage macht keinen Sinn.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top