Nem tudo é perfeito, o Java infelizmente não foge a essa regra. Segue abaixo a minha lista de coisas que não gosto na linguagem. Você tem também suas “mágoas”? Dê sua opinião!
-
O comando wait(0) espera para sempre, ao invés de não esperar. Isso torna códigos que façam wait baseados em algum cálculo um inferno, já que sempre temos que testar se o resultado é zero;
-
O wait está sujeito a spurious wakeups;
-
Quando interagindo com aplicações C++, realmente faz falta os tipos unsigned. Pelo menos, em cases de stream de sockets e na classe ByteBuffer (onde assume-se que você vai trabalhar com alguém externo) deveriam haver métodos nativos para trabalhar com unsigned, nem que fosse fazendo conversões só para a rede;
-
Existem coisas extremamente complexas que são fáceis de fazer (como esperar uma conexão ou sincronizar threads). Por outro lado, coisas triviais em outras linguagens (limpar o console, pegar o diretório que a aplicação roda) são praticamente impossíveis de se fazer em java;
-
O método read de um socket bloqueante lê n bytes ou menos, e não especificamente os n bytes, como seria em qualquer outra implementação socket padrão;
-
A linguagem java deveria ter removido o break do switch. Já que fall through é muito sujeito a erros. O mesmo vale para ifs envolvendo atribuições e outros mandraquismos “C”;
-
Não está no contrato do close() do OutputStream a necessidade de um flush() antes de fechar a conexão;
-
Existem coisas que simplesmente deveriam estar no Swing e não estão. Por exemplo, setLength() no JTextField, a classe JTreeTable, etc. Ok, o Swing é bem feito e isso é implementável, mas coisas tão úteis assim deveriam vir na biblioteca padrão. A utilidade dessas coisas é comprovada até por artigos da própria Sun, que ensinam a implementar tais funcionalidades;
-
A API está começando a ficar “gorda”, já que em nome da compatibilidade classes muito antigas não são eliminadas. Infelizmente, não creio que haja uma solução para esse problema, a não ser talvez criar duas distribuições java (uma com as classes do passado, outra sem, para ser usada em projetos novos).
[EDIT] 10. O Swing é muito poderoso, mas também é muito pesado.
-
Não deveria ser permitido uma subclasse ter um atributo com o mesmo nome de um atributo visível na superclasse.
-
Deveria haver o escopo de subpacote e um encapsulamento que envolvesse herança, mas não visibilidade entre membros de um mesmo pacote. Mas dá para entender o porque de não fazer isso, ter centenas de tipos de visibilidade podem trazer mais mal do que bem…
PS: O título do Java foi só para chamar a atenção. Muita coisa eu realmente não odeio, só desgosto ou me incomoda um pouco.