Confiar na inicialização padrão do campo - é um estilo de programação ruim? [fechadas]

20

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?

Andremoniy
fonte
5
Hã. Eu nunca soube que essa declaração estava lá. Na verdade, considero uma boa prática confiar neles. 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 com extends Object.
VGR
2
... ou ter um public abstractmétodo em uma interface.
Mumpitz
11
o que há de errado com o resumo público?
John Keates
11
Uma peça do quebra-cabeça pode vir de C ++. É uma linguagem popular, e o tratamento da inicialização padrão versus a inicialização zero é uma fonte contínua de bugs. No C ++, é uma péssima idéia confiar nos padrões em todos os casos, exceto nos mais excepcionais. Isso pode ter vazado culturalmente para Java.
Cort Ammon
@ JohnKeates - Meu Java está um pouco enferrujado, mas os privatemétodos em uma interface não fazem sentido e abstractestão implícitos.
Scott Smith

Respostas:

6

O texto citado é:

"Contar com esses valores padrão, no entanto, geralmente é considerado um estilo de programação ruim".

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.

Stephen C
fonte
19

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.

GhostCat saúda Monica C.
fonte
3
ou seja, re: not communicating intent - E se "Manny the mantenedor" estiver analisando seu código e não souber qual é o padrão para um tipo de dados específico. Ele está assumindo que é 0 quando é realmente NULL e esse é o erro inteiro em uma verificação === (ou qualquer que seja a verificação de igualdade equivalente para valor e tipo em java, equals ()?). Horas de pesquisa (por um programador inexperiente) podem ser o resultado de algo tão simples. PS tentando bancar o advogado do diabo. Eu digo que use os padrões o dia todo (mesmo que nunca o faça) e obtenha pessoas mais inteligentes (ou pelo menos maior atenção aos detalhes) para manter seu código.
TCooper
@TCooper, quando Mannie, o mantenedor, sabe muito pouco sobre Java, não tem como tocar no código Java do mundo real. Mas eu concordo com a noção subjacente. Isso torna as coisas mais difíceis para iniciantes.
GhostCat saúda Monica C. 19/10/19
12

Por que diabos essa é uma má prática de programação

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.

... se for amplamente utilizado mesmo no código fonte das bibliotecas Java SE ??

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

Michael Berry
fonte
2
Provavelmente isso está certo, embora eu não concorde com isso.
VGR
3
@VGR Por mais que eu tenha concordado com a afirmação de que confiar nos valores padrão não é o ideal, tomei o cuidado de expressá-la de maneira neutra por esse motivo. A qualidade do código é subjetiva e estou bem ciente de que essa não é, de maneira alguma, uma visão universal.
Michael Berry