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 № 1Quando 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.