/ / Existem razões para tornar todos os campos e variáveis ​​finais? - java, estilo de codificação, final

Há alguma razão para tornar todos os campos e variáveis ​​finais? - java, estilo de codificação, final

No meu projeto atual, notei que todos os campos de classe e métodos internos de variáveis ​​são declarados com modificador final sempre que possível.

Assim como aqui:

private final XMLStreamWriter _xmlStreamWriter;
private final Marshaller _marshaller;
private final OutputStream _documentStream;

private final OutputStream _stylesStream;
private final XMLStreamWriter _stylesStreamWriter;
private final StyleMerger _styleMerger;

public DocumentWriter(PhysicalPackage physicalPackage) throws IOException {
final Package pkg = new Package(physicalPackage);

final Part wordDocumentPart = pkg.createPart(
"/word/document.xml",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml",
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument");

// styles.xml
final Pair<Part, String> wordStylesPart = wordDocumentPart.createRelatedPart(...);
...
}

Existem razões para fazê-lo?

p.s. Como eu sei, o projeto não deve ser multithread (pelo menos eu não ouvi nada sobre isso).

Respostas:

4 para resposta № 1

Quando você escreve final, está sinalizando ao compilador e ao leitor humano que essa variável é definida uma vez e depois não é alterada.

O compilador o utiliza para verificar se você não reatribui acidentalmente uma variável. Se você fizer isso, ocorrerá um erro de compilação.

O leitor humano pode usá-lo para entender a intenção do código mais rapidamente.

Perder isso normalmente não fará com que seu códigofalhar, mas se você deseja que um campo não seja alterado, é uma boa ideia dizer isso explicitamente. Observe também que algumas vezes a final é obrigatória, por exemplo, ao usar classes locais:

Além de acessar os campos definidos pelocontendo classe, as classes locais podem acessar quaisquer variáveis ​​locais, parâmetros de método ou parâmetros de exceção que estejam no escopo da definição do método local e declarados finais.

Por outro lado, pode haver momentos em que você deseja ser capaz de reatribuir a uma variável. Obviamente, neste caso, você não deve declarar isso como final.


4 para resposta № 2

Na programação, é melhor obter um erro do compilador do que um erro lógico. Os erros do compilador são encontrados em segundos e são corrigidos muito rapidamente.

A palavra-chave final pode ajudar a converter erros lógicos em erros do compilador sem muito esforço.

Por exemplo:

public int test(int num){
num = 10;
x = num*2
return  x;
}

No exemplo acima, podemos atribuir acidentalmente um novo valor à variável num, para que o valor de retorno esteja errado. Com a palavra-chave final, evitamos esse tipo de erro.

public int test(final int num){
num = 10; //compiler error
x = num*2
return  x;
}

2 para resposta № 3

Classes imutáveis ​​são inerentemente seguras para threads emque você pode compartilhar com segurança entre os threads. Se você declarou todos os campos de uma classe final (e a própria classe é final) também assumindo que cada campo é imutável, esse objeto pode ser compartilhado com segurança entre os segmentos.


0 para a resposta № 4

Teoricamente, a JVM pode otimizá-las melhor, mas não sei se realmente faz. final é usado para indicar que você pode atribuir um valor à variável apenas uma vez.


-1 para resposta № 5

E praticamente o objeto está em 2 ou maiscarregadores de classes, como o ambiente do servidor de aplicativos e, portanto, serão atribuídos mais de uma vez até o final. Ou carregar uma final declarada a partir de um arquivo de propriedades alterado posteriormente; aconteceu aqui, remover as variáveis ​​finais e normais declaradas ficou mais pragmático.