Naturalmente, la mejor persona para hacer esta pregunta es alguien en el Comité Ejecutivo de JCP, no nosotros. Sin embargo, eso no me impedirá participar en una especulación ociosa.
La respuesta a cada pregunta de "por qué no se implementó esta característica" es siempre porque los beneficios no excedieron los costos.
Eric Lippert (ex miembro del equipo de C #) dice que, para que un producto tenga una característica, esa característica debe ser:
- pensado en primer lugar
- deseado
- diseñado
- especificado
- implementado
- probado
- documentado
- enviado a los clientes
En otras palabras, debe haber muchas cosas importantes que deben suceder antes de que se pueda realizar una nueva característica del lenguaje de programación. Los costos son mayores de lo que cree que son.
En el equipo de C #, cada solicitud de nueva característica comienza con una puntuación de menos 100. Luego, el equipo evalúa los beneficios y los costos, sumando puntos por los beneficios y restando puntos por los costos. Si la puntuación no supera el cero, la característica propuesta se descarta sumariamente. En otras palabras, la nueva característica debe proporcionar un beneficio convincente.
Pero el operador de Elvis lo convirtió en C #. Entonces, ¿por qué no llegó a Java?
A pesar de sus aparentes similitudes, Java y C # tienen filosofías de lenguaje significativamente diferentes. Esto se evidencia por el hecho de que los programas empresariales Java tienden a ser grandes colecciones estructurales de arquitectura. La brevedad y la expresividad del lenguaje se sacrifican en el altar de la ceremonia y la facilidad de codificación. Los patrones arquitectónicos de software bien conocidos que todos los miembros del equipo de desarrollo pueden reconocer son preferibles a las comodidades del lenguaje.
Considere este intercambio de Reddit :
El operador de Elvis se ha propuesto para todas las versiones de Java desde 7, y se ha rechazado cada vez. Diferentes lenguajes caen en diferentes puntos a lo largo del espectro desde "puro" hasta "pragmático", y los lenguajes que implementan el operador de Elvis tienden a estar más hacia el extremo pragmático del espectro que Java.
Si tiene un equipo de profesionales Java de más de 15 años escribiendo un sistema de procesamiento de back-end altamente distribuido y altamente concurrente de algún tipo, entonces probablemente desee un gran grado de rigor arquitectónico.
Sin embargo, si tiene un equipo de nivel junior a medio, la mitad de los cuales emigró de Visual Basic, y los tiene escribiendo una aplicación web ASP.NET que en su mayoría solo realiza operaciones CRUD ... entonces podría ser excesivo diseñar un montón de AbstractFactoryFactoryclases para abstraer el hecho de que no tiene control sobre qué columnas son anulables en la base de datos heredada de mierda que debe usar.
Estas profundas diferencias en la filosofía del lenguaje se extienden no solo a la forma en que se usan los idiomas, sino a la forma en que se lleva a cabo el proceso de diseño del lenguaje en sí. C # es un lenguaje dictador benevolente . Para obtener una nueva función en C #, solo tiene que convencer a una persona: Anders Hejlsberg .
Java adopta un enfoque más conservador. Para obtener una nueva característica en Java, debe obtener el consenso de un consorcio de grandes proveedores como Oracle, IBM, HP, Fujitsu y Red Hat. Obviamente, ese proceso será más lento y presentará una barra más alta para las nuevas características del lenguaje.
La pregunta "¿por qué no se implementó la función x ..." siempre incluye implícitamente las palabras, "... si obviamente es una buena idea?" Como he demostrado adecuadamente aquí, la elección nunca es tan simple.