Kotlin est principalement connu comme un remplacement de remplacement pour Java, mais il supprime un bien connu Java: le mot clé static
. Au lieu de cela, cette fonctionnalité au niveau de la classe est offert principalement par des objets compagnons.
Quel est le problème avec les méthodes statiques et les champs que les objets compagnons fournissent une meilleure alternative? Je suis confus quant à la justification et je n'ai trouvé aucune explication dans la documentation.
Scala remplace également les déclarations de niveau classe par un objet 'Singleton'. Le principal avantage de cela est que tout est un objet. En Java, les membres statiques sont traités très différemment des membres d'objet. Cela signifie que vous ne pouvez pas faire des choses comme implémenter une interface ou mettre votre classe "instance" dans une carte ou la passer en paramètre à une méthode qui prend Object. Les objets compagnons permettent ces choses. Voilà l'avantage.
Citant du Kotlin documents de référence :
Notez que, même si les membres des objets compagnons ressemblent à des membres statiques dans d'autres langages, ceux-ci sont toujours des membres d'instance d'objets réels et peuvent, par exemple, implémenter des interfaces.
Cela me semble beaucoup comme si les concepteurs de Kotlin y voyaient un avantage sur les membres statiques de Java.
De plus, la partie concernant interopérabilité Java et membres statiques explique comment les objets compagnons peuvent être utilisés pour créer des membres qui se comportent efficacement comme des membres statiques lorsqu'ils sont annotés avec @JvmStatic
.
Kotlin est un langage orienté objet. Dans un langage orienté objet, quelque chose pas être un objet est une restriction extrêmement paralysante. Les classes ne sont pas des objets, mais les objets sont des objets (duh!), Donc la question devrait plutôt être: pourquoi un langage pas utiliserait-il des objets compagnons?
Un autre aspect est la simplicité: pourquoi avoir deux choses, des objets avec des membres d'instance et des classes avec des membres statiques alors que vous pouvez simplement avoir des objets avec des membres d'instance?
Une alternative utilisée dans de nombreux langages dérivés de Smalltalk est de faire des classes elles-mêmes des objets. Par exemple. dans les classes Smalltalk sont des instances d'une hiérarchie parallèle de métaclasses. Dans Ruby, les classes sont des instances de la classe Class
(et oui, cela signifie que Class
est une instance d'elle-même). Dans ce cas, les "méthodes de classe" ne sont en fait que des méthodes d'instance normales de la métaclasse de la classe. Je ne sais pas pourquoi cette conception n'a pas été choisie dans Java (étant donné sa proximité avec Smalltalk), mais cela peut avoir quelque chose à voir avec la simplification du système de type (notez que la plupart des langues avec des classes en tant qu'objets ont tendance à être des langages dynamiques).