Pergunta

Por exemplo:

public void doSomething() {

    final double MIN_INTEREST = 0.0;

    // ...  
}

Pessoalmente, eu prefiro ver essas constantes de substituição declarada estaticamente no nível da classe. Acho que eu estou procurando um "ponto de vista da indústria" sobre o assunto.

Foi útil?

Solução

A minha posição inicial é que cada variável ou constante deve ser declarada / inicializado como perto de seu primeiro uso possível / prático (ou seja, não quebrar um bloco lógico de código pela metade, apenas para declarar algumas linhas mais perto), e escopo tão firmemente quanto possível. -. A menos que você pode me dar um motivo muito bom por que deveria ser diferente

Por exemplo, um método escopo final não será visível na API pública. Às vezes, este bit de informação poderia ser sair úteis para os usuários de sua classe, e deve ser movida para cima.

No exemplo que você deu na pergunta, eu diria que MIN_INTEREST é provavelmente um daqueles pedaços de informação que um usuário gostaria de ter em suas mãos, e deve ser delimitado para a classe, não o método. (Embora, não há contexto para o código de exemplo, e minha suposição poderia ser completamente errado.)

Outras dicas

Gostaria de pensar que você só deve colocá-los no nível de classe, se eles são usados ??por vários métodos. Se ele só é usado nesse método, então, que parece bem para mim.

Tecnicamente, não existe tal coisa como um "método escopo constante" em Java. O que você está se referindo é simplesmente uma variável local final; ele é criado um destruído com cada invocação de método.

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

Informações esconderijo e modularidade são princípios-chave e de definição do âmbito estreito é melhor informação esconderijo. Se a constante só é necessária pelo método, o esconderijo é bom. Se e quando a constante está em outro lugar útil, trazê-lo para fora para um âmbito mais alargado, mas apenas tão amplamente quanto necessário.

Você provavelmente estão preocupados porque esta é uma constante e, portanto, pode parecer pertencer a alguma tabela de propriedades global. Talvez ele faz. Talvez isso não acontece. Sua preocupação é válida, mas não há ninguém melhor lugar para todas as constantes.

Eu usei este método no escopo constantes de mim, mas de vez em quando um colega vai para baixo mod-lo durante as revisões de código. Novamente, esses colegas não estão em leitura / escrita de código aberto, mas eles são usados ??para o software da empresa.

Digo-lhes que não faz sentido usar uma constante nível de classe, se for utilizado dentro de um único método, mas eu encontrei mais de 1 colega insistindo que ser movida para cima. Eu costumo cumprir desde que eu não sou tão rígido a menos que afeta a legibilidade e / ou desempenho.

Eu tenho uma opinião diferente sobre isso: IMHO o seu melhor para colocá-los no escopo do arquivo / classe especialmente se você estiver trabalhando em equipes para esta razão: digamos que você começar com um pequeno pedaço de código ...

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}

e outros membros da equipe que você expanda a classe de todo monte de métodos e agora a classe é um maravilhoso 500 lines / 50 methods classe gigante. Imagine a experiência de um engenheiro que está tentando adicionar um novo método com uma constante, eles terão de 1 varrer toda a classe procurando constantes que correspondem a sua necessidade, 2 mover o constante para escopo de classe na esperança de que não há conflitos com existente código e 3 também adicionar o seu método.

Se você, em vez adicionar todas as constantes no escopo do arquivo / classe, para começar, os engenheiros têm um único lugar 1 para olhar para constantes existentes e, 2 derivam algumas constantes de outros em que faz sentido. (Por exemplo, se você tem uma constante para pi você também pode querer definir uma nova constante com um valor de pi/2).

A razão pela qual você pode definir uma variável final em um nível de classe ou nível de método (local) é porque você pode substituir a constante estática global, dentro do método (local).

Exemplo:

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

    }
}

A saída será:

Local-> 0.1
Global-> 0.0

Assim, a pergunta não faz qualquer sentido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top