Dúvida com métodos estáticos

Bom dia galera, estou estudando o livro de certificação e me surgiu uma dúvida referente a métodos estáticos.

Fiz um exercício composto pelas seguintes classes:

public class Singer { public static String sing() { return "la"; } }

public class Tenor extends Singer { public static String sing() { return "fa"; } public static void main(String[] args) { Tenor t = new Tenor(); Singer s = new Tenor(); System.out.println(t.sing() + " " + s.sing()); } }

Segue a pergunta do livro: Dadas as classes acima, aponte a alternativa correta:

A. fa fa
B. fa la
C. la la
D. Compilation fails
E. An exception is thrown at runtime

Eu respondi a alternativa D, mas o livro apontou a B como correta. Fiz a prova na IDE e funciona realmente, porém ele deixa um warning na linha 6 da classe tenor, justamente dizendo que os métodos deveriam ser(should be) acessados de modo estático.

Até então eu havia aprendido que pra acesso de variáveis, constantes e métodos estáticos deve-se usar o nome da classe ponto nome do método, e nem sabia que poderia acessar através de variáveis de referência, nunca tentei isso por ter aprendido do outro modo.

Aí fica a pergunta principal: Acessar estáticos com variáveis de referência é possível, porém não é indicado. Isso é considerado CERTO ou NÃO? Até onde eu aprendi nesses 8 meses de aprendizado contínuo da linguagem, essa não é uma boa prática. LOGO não deve ser seguida, e muito menos apontada como certa no livro da certificação…

Fica complicado aprender de professores e colegas com mais experiência que algo é errado, e depois ver no livro de certificação que os autores consideram essa prática correta. E a própria IDE diz que deveria ser de outro modo…

O que vocês acham? Aprendi errado?

OBS: É o livro SCJP6 versão em Inglês.

Eles podem ser acessados por uma variável de instância, mas é recomendado que seja acessado estaticamente pelo nome da classe justamente para evitar essas confusões.

Se você acessa diretamente pela classe, você já tem certeza de qual método está sendo executado.

Acho que não é uma questão de certo ou errado. É apenas outra maneira de se fazer a mesma coisa.
Você pode chamar métodos estáticos sem um objeto instanciado Classe.metodo() ou a partir de um objeto instanciado dessa classe.

É mais conveniente chamar Classe.metodo(), sem instanciação.
Também poderíamos considerar performance pois instanciando você coloca mais um objeto na heap desnecessariamente, talvez por isso o IDE tenha emitido um warning.

Tem muita coisa nesse livro que está lá só para testar nosso conhecimento sobre o funcionamento do java, porém com pouca aplicabilidade no marcado.
Não chega a ser errado, mas não fica pratico chamar métodos estaticos a partir de objetos instanciados no caso desse exemplo do livro.

att

Pois é, fui trollado pelo livro…

Porém os autores definem essa prática como algo que é certo, e nem na resolução da questão apontam que deve ser feito de outra forma. Acho que deveriam mostra que pode ser feito com variáveis de instância mas que a melhor prática é fazer direto pelo nome da classe…

:roll:

[quote=Ruttmann]Pois é, fui trollado pelo livro…

Porém os autores definem essa prática como algo que é certo, e nem na resolução da questão apontam que deve ser feito de outra forma. Acho que deveriam mostra que pode ser feito com variáveis de instância mas que a melhor prática é fazer direto pelo nome da classe…

:roll: [/quote]
É o livro da Kathy Sierra e do Bert Bates? Eu lembro de ler nesse livro que eles recomendam utilizar Classe.metodoEstatico()

O livro de certificação pra SCJP está longe de ser uma referência para boas práticas. A alternativa correta, no contexto do livro, mostra o que acontece quando as classes são compiladas e executadas (o que será impresso no console, erro de compilação, exceção, etc), e não a alternativa que segue as melhores práticas.

[quote=Gustavo Marques]É mais conveniente chamar Classe.metodo(), sem instanciação.
Também poderíamos considerar performance pois instanciando você coloca mais um objeto na heap desnecessariamente, talvez por isso o IDE tenha emitido um warning.
att[/quote]
+1

[quote=Rodrigo Sasaki][quote=Ruttmann]Pois é, fui trollado pelo livro…

Porém os autores definem essa prática como algo que é certo, e nem na resolução da questão apontam que deve ser feito de outra forma. Acho que deveriam mostra que pode ser feito com variáveis de instância mas que a melhor prática é fazer direto pelo nome da classe…

:roll: [/quote]
É o livro da Kathy Sierra e do Bert Bates? Eu lembro de ler nesse livro que eles recomendam utilizar Classe.metodoEstatico()[/quote]

Sim, esse mesmo.

No conteúdo realmente só se recomenda usar Classe.métodoEstatico(), e por isso mesmo apontei a resposta que apontei.

Sei que está errado, pois realmente vai compilar e executar, mas não é boa prática.

Acho meio chato a forma com que eles escrevem o código, todo grudadinho só porque “na certificação é assim pra economizar espaço”. To vendo que vou ter que estudar mais um pouco sobre boas práticas pra não acabar tomando como certas as bizarrices que aparecem no livro de vez em quando.

:roll:

Muito código que posto aqui reconhecidamente não obedece às melhores práticas, a menos que eu diga explicitamente isso.

Muitas vezes eu tento escrever o código mais claro que faz uma determinada coisa - e então você vai ver certas coisas, por exemplo, como o uso de Null Layout em Swing, que não recomendo para ninguém. Ou então acessar diretamente os campos de uma classe, sem usar setters e getters. Não aconselho que as pessoas façam copy & paste do meu código, justamente porque

  • Eu uso um estilo muito peculiar, fácil de ser detectado pelos professores :slight_smile:
  • Pretendo sempre mostrar como se faz mas não qual é a melhor prática (até porque a “melhor prática” é uma superstição inventada por aquelas pessoas que não pensam antes de fazer :slight_smile: )

[quote=entanglement]Muito código que posto aqui reconhecidamente não obedece às melhores práticas, a menos que eu diga explicitamente isso.

Muitas vezes eu tento escrever o código mais claro que faz uma determinada coisa - e então você vai ver certas coisas, por exemplo, como o uso de Null Layout em Swing, que não recomendo para ninguém. Ou então acessar diretamente os campos de uma classe, sem usar setters e getters. Não aconselho que as pessoas façam copy & paste do meu código, justamente porque

  • Eu uso um estilo muito peculiar, fácil de ser detectado pelos professores :slight_smile:
  • Pretendo sempre mostrar como se faz mas não qual é a melhor prática (até porque a “melhor prática” é uma superstição inventada por aquelas pessoas que não pensam antes de fazer :slight_smile: )
    [/quote]

Desculpe, não entendi sua explicação, você quis fazer uma analogia aos códigos do livro?