Domanda

Ad esempio:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

Personalmente, preferirei vedere queste costanti di sostituzione dichiarate staticamente a livello di classe. Suppongo che sto cercando un "punto di vista del settore" sulla questione.

È stato utile?

Soluzione

La mia posizione iniziale è che ogni variabile o costante dovrebbe essere dichiarata / inizializzata il più vicino possibile al primo utilizzo / pratico (cioè non rompere un blocco logico di codice a metà, solo per dichiarare alcune righe più vicine), e mirato il più strettamente possibile. - A meno che tu non possa darmi una dannata buona ragione per cui dovrebbe essere diverso.

Ad esempio, un final nell'ambito del metodo non sarà visibile nell'API pubblica. A volte queste informazioni potrebbero essere utili agli utenti della tua classe e dovrebbero essere spostate verso l'alto.

Nell'esempio che hai fornito alla domanda, direi che MIN_INTEREST è probabilmente una di quelle informazioni su cui un utente vorrebbe mettere le mani, e dovrebbe essere portata alla classe, non al metodo. (Sebbene, non vi sia alcun contesto nel codice di esempio e la mia ipotesi potrebbe essere completamente sbagliata.)

Altri suggerimenti

Penso che dovresti metterli a livello di classe solo se vengono utilizzati da più metodi. Se viene utilizzato solo in quel metodo, allora per me va bene.

Tecnicamente, non esiste una costante con ambito "metodo" " in Java. Quello a cui ti riferisci è semplicemente una variabile locale finale; viene creato un distrutto con ogni invocazione del metodo.

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

Il nascondimento delle informazioni e la modularità sono principi chiave, mentre l'ambito ristretto è un migliore nascondimento delle informazioni. Se la costante è necessaria solo con il metodo, il nascondiglio è buono. Se e quando la costante è utile altrove, portala ad un ambito più ampio, ma solo nel modo più ampio necessario.

Probabilmente sei preoccupato perché questa è una costante e, pertanto, potrebbe sembrare appartenere a una tabella delle proprietà globali. Forse lo fa. Forse no. La tua preoccupazione è valida, ma non esiste un posto migliore per tutte le costanti.

Ho usato da solo questo metodo con costanti nell'ambito ma ogni tanto un collega la modifica durante le revisioni del codice. Ancora una volta, questi colleghi non amano leggere / scrivere open source ma sono utilizzati per software aziendali.

Dico loro che NON ha senso usare una costante a livello di classe se viene usata all'interno di un singolo metodo, ma ho trovato più di 1 collega che insiste sul fatto che sia spostato verso l'alto. Di solito mi conformo poiché non sono così rigido a meno che non influisca sulla leggibilità e / o sulle prestazioni.

Ho una visione diversa su questo: IMHO è meglio posizionarli nell'ambito di file / classe soprattutto se stai lavorando in team per questo motivo: supponi di iniziare con un piccolo codice ...

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}

e altri membri del tuo team espandono la classe con un sacco di metodi e ora la classe è una meravigliosa classe gigante 500 linee / 50 metodi . Immagina l'esperienza di un ingegnere che sta cercando di aggiungere un nuovo metodo con una costante, dovranno 1 scansionare l'intera classe alla ricerca di costanti che soddisfino le loro esigenze, 2 sposta la costante in ambito di classe sperando che non vi siano conflitti con il codice esistente e 3 aggiunge anche il loro metodo.

Se invece si aggiungono tutte le costanti nell'ambito del file / classe per cominciare, gli ingegneri hanno un 1 posto singolo dove cercare le costanti esistenti e, 2 derivano alcune costanti da altri dove ha senso. (ad esempio se hai una costante per pi potresti anche voler definire una nuova costante con un valore di pi / 2 ).

Il motivo per cui è possibile definire un'ultima variabile a livello di classe o metodo (locale) è perché è possibile ignorare la costante statica globale all'interno del metodo (locale).

Esempio:

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);

    }
}

L'output sarà:

Local-> 0.1
Global-> 0.0

Quindi la tua domanda non ha alcun senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top