Naturellement, la meilleure personne pour poser cette question est un membre du comité exécutif du JCP, pas nous. Cependant, cela ne m'empêchera pas de me livrer à des spéculations inutiles.
La réponse à chaque question «pourquoi cette fonctionnalité n'a-t-elle pas été implémentée» est-elle toujours parce que les avantages n'ont pas dépassé les coûts.
Eric Lippert (ancien membre de l'équipe C #) dit que, pour qu'un produit ait une fonctionnalité, cette fonctionnalité doit être:
- pensé en premier lieu
- voulu
- conçu
- spécifié
- mis en œuvre
- testé
- documenté
- expédié aux clients
En d'autres termes, il doit y avoir beaucoup de choses importantes qui doivent se produire avant que toute nouvelle fonctionnalité de langage de programmation puisse être réalisée. Les coûts sont plus importants que vous ne le pensez.
Dans l'équipe C #, chaque nouvelle demande de fonctionnalité commence par un score de moins 100. Ensuite, l'équipe évalue les avantages et les coûts, en ajoutant des points pour les avantages et en soustrayant des points pour les coûts. Si le score ne dépasse pas zéro, la fonctionnalité proposée est rejetée sommairement. En d'autres termes, la nouvelle fonctionnalité doit fournir un avantage convaincant.
Mais l' opérateur Elvis en a fait C #. Alors pourquoi n'a-t-il pas réussi à devenir Java?
Malgré leurs similitudes apparentes, Java et C # ont des philosophies de langage considérablement différentes. Cela est démontré par le fait que les programmes d'entreprise Java ont tendance à être de grandes collections structurelles d'architecture. La brièveté et l'expressivité du langage sont sacrifiées sur l'autel de la cérémonie et la facilité de codage. Les modèles d'architecture logicielle bien connus que tout le monde dans l'équipe de développement peut reconnaître sont préférés aux commodités linguistiques.
Considérez cet échange Reddit :
L'opérateur Elvis a été proposé pour chaque version de Java depuis 7, et a été rejeté à chaque fois. Différents langages se situent sur différents points du spectre, de "purs" à "pragmatiques", et les langages mettant en œuvre l'opérateur Elvis tendent à être plus avancés vers l'extrémité pragmatique du spectre que Java.
Si vous avez une équipe de professionnels Java de plus de 15 ans qui écrivent un système de traitement backend hautement distribué et hautement simultané, vous voudrez probablement une grande rigueur architecturale.
Cependant, si vous avez une équipe de niveau intermédiaire à intermédiaire, dont la moitié a migré de Visual Basic, et que vous leur demandez d'écrire une application Web ASP.NET qui effectue principalement des opérations CRUD ... alors il peut être exagéré de concevoir un groupe de AbstractFactoryFactory
classes pour éliminer le fait que vous n'avez aucun contrôle sur les colonnes qui peuvent être annulées dans la base de données héritée de merde que vous devez utiliser.
Ces différences profondes dans la philosophie du langage ne concernent pas seulement la façon dont les langues sont utilisées, mais aussi la façon dont le processus de conception du langage lui-même est entrepris. C # est un langage de dictateur bienveillant . Pour intégrer une nouvelle fonctionnalité en C #, il suffit de convaincre une seule personne: Anders Hejlsberg .
Java adopte une approche plus conservatrice. Pour intégrer une nouvelle fonctionnalité à Java, elle doit obtenir le consensus d'un consortium de grands fournisseurs tels que Oracle, IBM, HP, Fujitsu et Red Hat. De toute évidence, ce processus va être plus lent et présenter une barre plus élevée pour les nouvelles fonctionnalités du langage.
La question "pourquoi la fonctionnalité x n'a-t-elle pas été implémentée ..." inclut-elle toujours implicitement les mots "... si c'est évidemment une si bonne idée?" Comme je l'ai suffisamment démontré ici, le choix n'est jamais aussi simple.