Y at-il un cas où un object compagnon (singleton) pour une classe est nécessaire? Pourquoi voudrais-je créer une classe, dire Foo
et créer un object compagnon pour elle?
L’object compagnon fournit essentiellement un endroit où l’on peut mettre des méthodes “statiques”. En outre, un object compagnon ou un module associé a un access complet aux membres de la classe, y compris les membres privés.
Les objects compagnons sont parfaits pour encapsuler des choses comme les méthodes d’usine. Au lieu d’avoir, par exemple, Foo
et FooFactory
partout, vous pouvez avoir une classe avec un object compagnon pour assumer les responsabilités de l’usine.
Les objects compagnons sont utiles pour stocker l’état et les méthodes communes à toutes les instances d’une classe, mais ils n’utilisent pas de méthodes ou de champs statiques . Ils utilisent des méthodes virtuelles régulières qui peuvent être remplacées par l’inheritance. Scala n’a vraiment rien de statique. Il existe de nombreuses façons d’utiliser cela, mais voici un exemple simple.
abstract class AnimalCounter { var animals = 0 def name: Ssortingng def count() { animals += 1 println("%d %ss created so far".format(animals, name)) } } abstract class Animal { def companion: AnimalCounter companion.count() } object Dog extends AnimalCounter { val name = "dog" } class Dog extends Animal { def companion = Dog } object Cat extends AnimalCounter { val name = "cat" } class Cat extends Animal { def companion = Cat }
Qui produit cette sortie:
scala> new Dog 1 dogs created so far scala> new Cat 1 cats created so far scala> new Dog 2 dogs created so far scala> new Cat 2 cats created so far
… et c’est un bon endroit pour stocker les méthodes d’usine statiques (pas celles de DP) pour les classes accompagnées. Si vous nommez ces méthodes d’usine surchargées, appliquez (/ … /) vous pourrez créer / initialiser votre classe
sans ‘nouveau’ (pas vraiment important)
avec différents ensembles de parameters possibles (comparez à ce que Bloch écrit dans Effective Java sur le constructeur télescopique)
avec la possibilité de décider quelle classe dérivée vous voulez créer au lieu de la classe abstraite (accompagnée)
Exemple de code:
abstract class AbstractClass; class RealThing(s: Ssortingng) extends AbstractClass; class AlternativeThing(i: Int) extends AbstractClass; object AbstractClass { def apply(s: Ssortingng) = { new RealThing(s) } def apply(i: Int) = { new AlternativeThing(i) } } // somewhere else you can val vs = AbstractClass("asdf") // gives you the RealThing wrapped over ssortingng val vi = AbstractClass(123) // gives you AlternativeThing wrapped over int
Je n’appellerais pas la classe object / base AbstractXxxxx car elle ne semble pas mauvaise: comme créer quelque chose d’abstrait. Donne à ces noms une vraie signification. Envisagez d’utiliser des classes de cas immuables, sans méthode et de sceller la classe de base abstraite.
En plus des choses que Saem a dites dans sa réponse , le compilateur Scala recherche également les conversions implicites de types dans les objects compagnons correspondants (de la source ou de la cible), de sorte que les conversions n’ont pas besoin d’être imscopes.
À propos de la raison d’être des objects singleton en général La programmation dans Scala dit:
Comme mentionné dans le chapitre 1, Scala est plus orienté object que Java car les classes de Scala ne peuvent pas avoir de membres statiques. Scala a plutôt des objects singleton (p. 65).
Je vois toujours les objects compagnons comme un pont pour écrire du code à la fois fonctionnel et orienté object dans Scala. Plusieurs fois, nous avons juste besoin de fonctions pures qui apportent des informations et fournissent un résultat de traitement. Mettre ces fonctions pertinentes dans l’object compagnon facilite la recherche et l’utilisation, tout comme pour un bâtiment en plus de mon code.
De plus, c’est une fonctionnalité fournie par le langage pour écrire le motif singleton sans rien faire. Ceci est particulièrement utile lorsque vous avez besoin d’un singleton pour encapsuler un délégué pour la durée de vie de JVM. Par exemple, écrire une bibliothèque de clients HTTP simple dans Scala où vous pouvez encapsuler un délégant basé sur une implémentation Java sous-jacente et permettre aux utilisateurs de votre API de vivre dans un monde pur.
Si vous définissez class et object dans le même fichier avec le même nom, ils sont appelés classe et object compagnon. Scala n’a pas de mot-clé JAVA statique. Vous pouvez remplacer statique par une classe et un object compagnon dans Scala.
Pour plus d’informations, veuillez vérifier la classe de l’ article et le mot clé de l’object dans la programmation Scala.
Au début, il fournit une séparation claire entre les méthodes statiques et les méthodes non statiques. Fournissez également un moyen simple de créer une classe singleton.
Il peut aussi hériter des méthodes d’autres classes et / ou traits, ce qui ne peut pas être fait avec les méthodes statiques Java. Et peut être passé en paramètre.