Aulas finais em Java que não deveriam ser finais ou vice-versa?

Recentemente me fizeram esta pergunta em uma entrevista:

Você pode nomear qualquer classe na API Java que seja final que não deveria ser ou uma que não é e deveria ser?

Eu não conseguia pensar em nenhum. A pergunta implica que eu deveria conhecer todas as classes de API como a palma da minha mão, o que eu pessoalmente não esperaria que nenhum desenvolvedor Java conhecesse.

Se alguém conhece essas classes, forneça exemplos.

Engraçado que esta mesma pergunta foi feita no StackOverflow exatamente à 10 anos atrás… Estranhei ao fato da tradução do Google traduzir Classes para Aulas

Existem várias classes na API Java que não são finais, mas poderiam ser. Por exemplo, a classe Map é uma boa candidata para ser marcada como final, pois o comportamento desta classe não deveria ser alterado em nenhuma circunstância. Por outro lado, o método Class.getSuperclass() não é marcado como final, mas talvez deva ser para evitar a sobrescrita indesejada.

Exemplos: Class getSuperclass() method in Java with Examples - GeeksforGeeks

1 curtida

Esse tipo de pergunta na minha opinião é um problema XY, na minha opinião, classes finais são um antipattern. No caso de Map, como ficariam as subclasses de Map, como, por exemplo, ConcurrentMap?

1 curtida

Acredito que terão o mesmo comportamento que a classe Map. No entanto, cada subclasse terá um conjunto único de funcionalidades adicionais que não estão presentes na classe Map. Por exemplo, ConcurrentMap inclui métodos para operações concorrentes e compartilhamento de dados entre vários threads.

1 curtida

Você no caso está pensando em Map como uma classe concreta ou uma interface? Pois a minha dúvida é, como você iria estender Map, se Map é uma classe final? É por esse motivo que a Map em Java é, na verdade, uma interface.

É por isso que, na minha opinião, Classes, tanto concretas como abstratas, não devem ser feitas finais, herança não é o problema em si.

1 curtida

Como interface. Se Map for marcada como final, não será possível estendê-la diretamente. É possível implementar a interface Map em uma nova classe, isso permitiria criar suas próprias funções e comportamentos que sejam desejados para a classe, mantendo o comportamento original de Map.

Sim sim, a ideia era mais debater sobre as possíveis possibilidades dentro da questão levantada pelo tópico. Existem workarounds, mas não recomendações.

2 curtidas

A questão é que interfaces não podem ser marcadas como finais em Java, você vai obter uma exceção por estar usando propriedades incompatíveis. Se fosse possível, uma interface seria inútil, pois a classe implementando não poderia herdar as assinaturas.

Sim, como eu disse, é minha opinião apenas. Minha questão com classes finais é que, são elas que cheiram a gambiarra para mim. A solução elegante é saber quando usar interfaces, classes abstratas e classe concretas… Saber que, na maioria das hipóteses, mas nem sempre, estender uma classe concreta é uma má ideia, documentar suas classes pensando em como as pessoas irão usar/herdar, etc.

2 curtidas

Apenas agregando mais algumas coisas para ajudar @jesse100 a pensar na questão.

Existem várias classes finais bem conhecidas em Java, como Math e String. Consigo pensar em bons motivos para elas não serem, e vice-versa, e colocando sob contexto eu consigo decidir se isso deveria ser feito hoje ou não, também.

Ter uma resposta bem embasada, independentemente de qual seja, é o que o entrevistador possivelmente quer (pelo menos é o meu caso, quando entrevisto). Se você vai liderar projetos, digamos, é importante pensar em funcionalidades de linguagens de programação, para além da mera função que elas executam.

Essa é uma típica pergunta capaz de dar insights para o entrevistador se você ainda é apenas da área “operacional” ou teria potencial para “planejamento”.

2 curtidas

Bem, muito obrigado pelo seu tempo e sim, você está certo, essa pergunta foi para verificar a velocidade do meu cérebro e, sim, também o meu potencial

1 curtida

Este tópico foi fechado automaticamente 3 dias depois da última resposta. Novas respostas não são mais permitidas.