Kotlin est principalement connu pour remplacer Java, mais il se débarrasse d'une construction Java bien connue: le static
mot - clé. Au lieu de cela, cette fonctionnalité au niveau de la classe est principalement proposée par les 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.
language-design
user1446
la source
la source
static
mot - clé en Java, il se propage immédiatement à tous les coins du programme car ils n'ont pas encore appris la programmation orientée objet .Réponses:
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 comme paramètre à une méthode qui prend Object. Les objets compagnons permettent ces choses. Voilà l'avantage.
la source
Citant les documents de référence de Kotlin :
Cela me semble beaucoup comme si les concepteurs de Kotlin y voyaient un avantage sur les membres statiques de Java.
De plus, la partie sur l'interopérabilité Java et les 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
@JvmStatic
.la source
Kotlin est un langage orienté objet. Dans un langage orienté objet, quelque chose qui n'est pas un objet est une restriction extrêmement paralysante. Les classes ne sont pas des objets, mais les objets sont des objets (duh!), Alors la question devrait plutôt être: pourquoi un langage n'utiliserait-il pas 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
Class
classe (et oui, cela signifie queClass
c'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 en Java (étant donné sa proximité avec Smalltalk), mais cela peut avoir quelque chose à voir avec la simplification du système de types (notez que la plupart des langages avec des classes en tant qu'objets ont tendance à être langages dynamiques).la source
MyStaticClass
avec certainsstatic
membres, vous pouvez faire référenceMyStaticClass.class
pour obtenir uneClass
instance pour cette classe. Vous pouvez ensuite utiliser la réflexion pour accéder / invoquer vosstatic
membres. Il est toujours vrai que lesstatic
membres ne sont en fait attachés à aucune instance d'objet (du moins sur le plan conceptuel; je ne suis pas sûr de ce que Java fait réellement sous les couvertures). Mais cela signifie qu'au moins certaines des limites soulevées dans la réponse acceptée ne s'appliquent pas strictement .