Otra razón por la que la gente odia a Java es el hecho de que se ha convertido en parte de The Establishment del mundo de la informática, y mucha gente siempre odia a The Establishment.
Pero desde mi perspectiva como alguien que enseña Java a principiantes, veo algunas otras deficiencias que otros no han señalado. Básicamente, Java comenzó como una versión más simple de C ++, pero aún es demasiado complejo; hay demasiados “bordes afilados”. Aquí hay algunas de las cosas que me molestan a mí y a muchos de mis estudiantes (todas son pequeñas, la mayoría no son exclusivas de Java, pero aún así suman una gran cantidad de complejidad innecesaria):
Los tipos primitivos no son clases y las operaciones primitivas no son métodos. Java insiste en que los operadores trabajan solo en tipos primitivos y los métodos funcionan solo en objetos. Bueno, excepto + trabaja en cuerdas. Pero aparte de eso, debes usar métodos para trabajar en objetos. Por ejemplo, usas .equals para comparar dos objetos para la igualdad. Bueno, excepto que usas == para comparar objetos a cero. Esto también significa que Java necesita clases de envoltura, ya que necesita un lugar para definir operaciones en tipos como enteros y caracteres. Por lo tanto, si desea obtener una representación de cadena de cualquier cosa, envíe un mensaje toString sin argumentos. Por ejemplo, para convertir una variable x en una cadena, debes hacer x.toString (). Excepto si es un tipo primitivo, entonces tiene que usar el método estático toString en la clase envoltura correspondiente, por ejemplo, Double.toString (x). Cada tipo primitivo tiene una clase envoltura correspondiente con el mismo nombre, pero en mayúscula. Excepto por int y char, cuyas clases de envoltura se llaman Integer y Character, sin ninguna buena razón que pueda imaginar.
Arrays . Algunos de los mismos problemas afectan a las matrices, por ejemplo, no tienen métodos. Bueno, excepto por la longitud. Es como un método para matrices, excepto que no tiene paréntesis. Así que supongo que es una variable de instancia, excepto que no se le puede asignar.
- ¿Por qué muchos iraníes odian a los árabes?
- ¿Por qué odio a los ingenieros de software?
- ¿Por qué los vendedores odian el papeleo?
- ¿Cuándo comenzó a usarse el término ‘odiado en’ en lugar de ‘odiado’?
- No sé por qué, pero odio a mi papá. ¿Cómo puedo detener este sentimiento estúpido?
Métodos estáticos. Java intenta ser un lenguaje estrictamente OO (pero falla; vea los puntos anteriores), por lo que cada método debe ser parte de alguna clase y cada mensaje debe enviarse a algún objeto. Pero, ¿y si realmente no hay ningún objeto para enviar el mensaje? Entonces el método debería ser estático, lo que realmente significa que no está orientado a objetos en absoluto, es básicamente un procedimiento. Los estudiantes a menudo crean instancias de una clase sin datos para que puedan enviar mensajes, cuando realmente quieren un método estático.
Esta. Cada otro dato que pase a un método tiene un nombre de parámetro formal que puede usar para acceder a él. ¿Por qué no hacer lo mismo con el objeto que recibe el mensaje, en lugar de crear la necesidad de una palabra clave especial ‘this’? Los estudiantes también se confunden de que una expresión foo es equivalente a this.foo (refiriéndose a la variable de instancia foo), excepto si también hay una variable local o parámetro llamado foo, en cuyo caso foo se refiere a eso.
Fugas de privacidad. Si su clase tiene una variable de instancia de tipo primitivo, puede hacerla privada y asegurarse de que ninguna otra clase puede modificar ese valor sin pasar por sus métodos; Tu clase tiene el control. Pero si la variable de instancia contiene un objeto, hacerlo privado no es suficiente. Si su clase pasa ese objeto a un método en otra clase, o lo devuelve como resultado de un método (por ejemplo, un descriptor de acceso), o almacena un objeto recibido de otra clase en esa variable de instancia, entonces el código fuera de su clase puede modificar ese objeto, evitando cualquier protección que su código implemente. El libro de texto que uso, Absolute Java, de Savitch, llama a esto una fuga de privacidad. Paso una buena media hora cada semestre explicando este problema y cómo evitarlo, y todavía una fracción significativa de mis alumnos no lo entienden.
Implementación de Java de genéricos. Los genéricos son geniales, pero la implementación de Java elimina la información de parámetros de tipo en tiempo de compilación, por lo que ciertas operaciones significativas y útiles simplemente no funcionan. Por ejemplo, no puede crear una matriz de objetos del tipo paramétrico de la forma que esperaría; Tienes que hacer algunas operaciones extrañas que involucran la reflexión.
Nulo. El error de mil millones de dólares de Tony Hoare. Debe verificar todo para asegurarse de que no sea nulo antes de enviar un mensaje o acceder a sus variables de instancia. Esto es a menudo descuidado. Pero incluso si pone los cheques, solo exponen el hecho de que un valor es nulo cuando no debería haber sido, no de dónde vino realmente el valor nulo.
Métodos estándar no genéricos. El método equals es una molestia de implementar, y debe implementarse por separado para cada tipo. E incluso si se implementa correctamente, los errores de tipo solo se detectan en tiempo de ejecución. Lo que es más, no hay error si se usa sin ser implementado adecuadamente; simplemente hace lo incorrectamente. Como señaló Marco Faella, compareTo es ahora un método genérico, por lo que la comprobación de tipos es mejor (pero aún debe implementarlo usted mismo, sin ayuda del lenguaje).
Copiar constructores contra el método de clonación. ¿Cuál es la forma correcta de hacer una copia de un objeto? Resulta que, tampoco está del todo bien. Y nuevamente, si no implementas cuidadosamente el clon para tu clase, se puede usar pero no funcionará correctamente.
Guía de Java
Videos paso a paso de Java – YouTube