Recebi um link para a documentação oficial do oracle: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
onde é dito:
Valores padrão
Nem sempre é necessário atribuir um valor quando um campo é declarado. Os campos declarados mas não inicializados serão definidos como um padrão razoável pelo compilador. De um modo geral, esse padrão será zero ou nulo, dependendo do tipo de dados. Contar com esses valores padrão, no entanto, geralmente é considerado um estilo de programação ruim.
Quero enfatizar esta parte:
Contar com esses valores padrão, no entanto, geralmente é considerado um estilo de programação ruim.
Mas, oh cara, isso é, eu diria, uma parte fundamental da especificação da linguagem, sabendo que as variáveis de instância têm valores padrão. Por que diabos essa é uma prática ruim de programação se é amplamente usada mesmo no código-fonte das bibliotecas Java SE?
fonte
private int count = 0;
é código que não faz nada, e código que não faz nada é desordem. É como importar classes do java.lang ou declarar uma classe comextends Object
.public abstract
método em uma interface.private
métodos em uma interface não fazem sentido eabstract
estão implícitos.Respostas:
O texto citado é:
Cinicamente: "geralmente se considera que" é frequentemente uma maneira de dizer que o autor não tentou encontrar uma fonte autorizada para a declaração que está sendo apresentada.
Nesse caso, a afirmação é claramente questionável. Evidência: 5 de 5 Java Style Guides amostrados NÃO dizem nada sobre se você deve ou deve confiar nos valores padrão:
(Observe, minha metodologia de amostragem foi examinar os 5 primeiros hits distintos da pesquisa no Google por "guia de estilo java". Depois, procurei em cada documento por "padrão". Esta não é uma análise completa, mas serve para esclarecer. )
ESTÁ BEM. Isso realmente ajuda na legibilidade do código Java?
Isso é discutível.
Por um lado, um programador iniciante em Java que não tenha aprendido sobre a inicialização padrão pode ficar confuso sobre a origem dos zeros ou nulos. Mas se eles se preocupam em procurar uma inicialização explícita e descobrir que não há uma, isso deve ser suficiente para fazer com que eles leiam um tutorial ou livro para descobrir sobre a inicialização padrão. (Você esperaria!)
Por outro lado, normalmente não esperamos que programadores Java iniciantes mantenham bases de código de produção. Para um programador Java experiente, uma inicialização redundante não melhora a legibilidade. É (na melhor das hipóteses) ruído.
Na minha opinião, a única coisa que é obtida com uma inicialização redundante de um campo é sinalizar para um futuro leitor do seu código que você pensou sobre o valor inicial. (Como o @GhostCat o expressou, a inicialização padrão não comunica intenção.)
Por outro lado, se eu fosse esse leitor, não confiaria necessariamente no pensamento do autor do código. Portanto, o valor desse "sinal" também é questionável.
E quanto à confiabilidade?
Em Java, não faz diferença. A JLS especifica que a inicialização padrão não ocorrer por campos. E, inversamente, para variáveis locais, é um erro de compilação tentar usar uma variável que ainda não foi definitivamente inicializada.
Em resumo, o comportamento em tempo de execução de uma variável que não é explicitamente inicializada é totalmente previsível.
Por outro lado, em linguagens como C ou C ++, onde variáveis não podem ser inicializadas, o comportamento não é especificado e pode levar a falhas e diferenças de comportamento em diferentes plataformas. O caso de sempre inicializar explicitamente variáveis é muito mais forte aqui.
E o desempenho?
Não deve fazer diferença. O compilador JIT deve poder tratar uma inicialização redundante e uma inicialização padrão da mesma forma.
fonte
Simples: confiar nos valores padrão não comunica intenção.
Você realmente queria que esse campo começasse com 0 ou esqueceu de atribuir um valor ?!
E, é claro, uma referência nula é metade das duas coisas necessárias para executar uma exceção de ponteiro nulo.
Por fim, o uso de padrões implica em campos não finais. Que você evita sempre que possível.
O único contra-argumento é: por que anotar coisas que você não precisa? Mas eu acho que as desvantagens listadas são melhores que atribuir 0 a um campo explicitamente, é melhor do que deixá-lo para o compilador.
fonte
A idéia é que, se você confiar em um valor padrão, não ficará imediatamente claro para quem lê o código se você o deixou deliberadamente como o valor padrão ou se esqueceu de atribuí-lo.
O código-fonte Java não é realmente algo em que você deva confiar como exemplo de prática de codificação exemplar. Há muitos casos em que essas regras são violadas (algumas vezes intencionalmente para pequenas melhorias de desempenho e outras acidentalmente ou porque o estilo aceito mudou ao longo dos anos).
fonte