Por que declarar uma String (como final) e depois usá-la?


8

Em uma classe típica de validador spring mvc, ao inserir um valor errorCode no objeto Errors, que diferença faz entre usar um String ( props.somefield.req) como esse

errors.rejectValue("elementId", "props.somefield.req");

versos uma String final estática declarada?

private static final String SOMFIELD_REQ = "props.somefield.req"; ...
errors.rejectValue("elementId", SOMFIELD_REQ);

Isso melhora o desempenho, mesmo que de maneira mínima? Eu li algumas perguntas sobre estouro de pilha ( String e final , faz sentido definir uma String final em Java? ), Mas ninguém conseguiu responder a essa pergunta de atualização de perguntas.


2
meta bit: a razão pela qual ninguém nunca respondeu foi que as extensões das perguntas existentes realmente não são boas perguntas. Coisas como 'Atualizar' e 'Editar' são sinais de uma pergunta assustadora (e se a pergunta assustadora for um idiota? Ou se alguém responder à atualização, mas não a original? Ou o original, mas não a atualização? - perguntas de acompanhamento em novas perguntas é a melhor política)

Toda string de leitura que é usada mais de uma vez pode ser economicamente colocada em um campo final estático, apenas para evitar erros de digitação incorreta ou para refatorar. Para literais que são usados ​​apenas uma vez, acho que isso realmente não importa.
Trilarion

Respostas:


21

Em tempo de execução, isso não faz diferença.

O ponto é a legibilidade - como uma variável membro, ela provavelmente é declarada no início do código fonte da classe e, tornando-a estática, significa que ela não precisa ser alocada para cada nova instância da classe.

Tornar final significa para o leitor que o valor não será alterado (para o compilador também, mas isso é menos importante aqui).

Dessa forma, não há "valores mágicos" ocultos na implementação e, se uma alteração for desejada na "constante", ela só precisará ser alterada em um único local.

Isso basicamente imita o que um programador C faria com um #define.


2
Com +1, o ganho de desempenho é irrelevante, trata-se de legibilidade, manutenção e intenção.
pllee 23/07

5

final campos têm muitos benefícios!

Declarar campos como finalpossui benefícios valiosos de documentação para desenvolvedores que desejam usar ou estender sua classe - não apenas ajuda a explicar como a classe funciona, mas também ajuda a ajuda do compilador na aplicação de suas decisões de design. Diferentemente dos finalmétodos, declarar um campo final ajuda o otimizador a tomar melhores decisões de otimização , porque se o compilador sabe que o valor do campo não será alterado, ele pode armazenar em cache com segurança o valor em um registro . finalOs campos também fornecem um nível extra de segurança, fazendo com que o compilador imponha que um campo seja somente leitura.

Não tente usar finalcomo uma ferramenta de gerenciamento de desempenho. Existem maneiras muito melhores e menos restritivas de melhorar o desempenho do seu programa. Use finalonde ele reflete a semântica fundamental do seu programa: para indicar que as classes devem ser imutáveis ​​ou que os campos devem ser somente leitura.

Antes de declarar os campos finais, você deve se perguntar: esse campo realmente precisa ser mutável?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.