Scala n'a pas de mot-clé statique, mais dispose à la place de fonctionnalités similaires via les objets compagnons. Dans les coulisses, les objets compagnons sont compilés en classes qui ont des méthodes statiques, donc tout cela est du sucre syntaxique. Quels sont les avantages de ce choix de conception? Désavantages? D'autres langues ont-elles des constructions similaires?
Voici quelques raisons, qui pourraient être plus ou moins convaincantes pour vous, selon vos propres préférences:
Ne l'escomptez pas simplement pour être du "sucre syntaxique". Bien que vous puissiez dire que quelque chose est juste sucre syntaxique, c'est après tout le sucre qui vous adoucit la vie - en tant que programmeur et buveur de café ou de thé.
Singletons - chaque Scala object
est intrinsèquement un singleton. Considérant que dans le monde Java les gens mettent en œuvre des singletons de toutes sortes de manières différentes et le plus souvent, vous finissez par faire une erreur dans leur implémentation, vous ne pouvez pas faire une erreur aussi simple que celle dans Scala. Écrire object
au lieu de class
en fait un singleton et vous avez terminé.
Accès aux méthodes statiques: les méthodes statiques de Java sont accessibles à partir d'objets. Par exemple, supposons que vous ayez une classe C
avec une méthode statique f
et un objet c
de type C
. Ensuite, vous devriez appeler C.f
, mais Java vous permet (bien qu'avec un avertissement) d'utiliser c.f
, qui lorsque vous venez de l'arrière-plan Scala n'a pas vraiment de sens, car les objets n'ont pas vraiment de méthode f
.
Séparation claire: en Java vous pouvez mélanger des attributs et des méthodes statiques et non statiques dans une classe. Si vous travaillez avec discipline, cela ne devient pas un problème, cependant, si vous (ou quelqu'un d'autre) d'ailleurs) non, alors vous vous retrouvez avec des parties statiques et non statiques entrelacées et il est difficile de dire d'un coup d'œil ce qui est statique et ce qui ne l'est pas. Dans Scala, tout ce qui se trouve à l'intérieur de l'objet compagnon ne fait clairement pas partie de les objets d'exécution de la classe correspondante, mais est disponible à partir d'un contexte statique. Inversement, s'il est écrit dans une classe, il est disponible pour les instances de cette classe, mais pas à partir d'un contexte statique. Cela devient particulièrement contraignant en Java, une fois que vous commencez à ajouter des blocs d'initialisation statiques et non statiques à votre classe. Cela peut être très difficile à comprendre en termes d'ordre d'exécution dynamique. C'est beaucoup plus clair dans Scala, où vous initialisez l'objet compagnon de haut en bas, puis faites idem pour la classe en cas d'objet runtime bei ng créé.
Moins de code: vous n'avez pas besoin d'ajouter le mot statique à chaque attribut ou méthode dans un object
, gardant ainsi le code plus concis (en effet, pas vraiment un avantage majeur ).
Les inconvénients sont beaucoup plus difficiles à trouver. On pourrait soutenir que les parties statiques et non statiques devraient appartenir ensemble, mais sont séparées par le concept Scala d'objets compagnons. Par exemple, il peut sembler étrange d'avoir un diagramme de classes, mais puis finir par devoir créer deux choses dans le code et disséquer quel attribut va où.
Un autre avantage est que object
s peut implémenter des interfaces/traits, contrairement aux méthodes statiques.
Les objets compagnons sont le premier endroit recherché pour les implicites, après cela, scala regarde Predef puis dans les instructions explicites "import" dans ce fichier source particulier.
Je ne suis pas assez un développeur Java pour savoir si le langage ou les bibliothèques Java fournissent un mécanisme comparable).