Je viens de passer en revue certains tutoriels Scala sur Internet et j'ai remarqué dans certains exemples qu'un objet est déclaré au début de l'exemple.
Quelle est la différence entre class
et object
à Scala?
class C
définit une classe, tout comme en Java ou C ++.object O
crée un objet singletonO
comme instance d'une classe anonyme; il peut être utilisé pour contenir des membres statiques qui ne sont pas associés à des instances d'une classe.object O extends T
fait de l'objet O
une instance de trait T
; vous pouvez ensuite passer O
n'importe où, un T
est attendu.class C
, alors object C
l' objet compagnon de la classe C
; notez que l'objet compagnon n'est pas automatiquement une instance de C
.Voir également la documentation Scala pour l' objet et la classe .
object
en tant que membre statiqueLe plus souvent, vous avez besoin d'un object
pour conserver les méthodes et les valeurs / variables qui seront disponibles sans avoir à instancier d'abord une instance d'une classe. Cette utilisation est étroitement liée aux static
membres de Java.
object A {
def twice(i: Int): Int = 2*i
}
Vous pouvez ensuite appeler la méthode ci-dessus en utilisant A.twice(2)
.
Si vous twice
étiez membre d'une classe A
, vous devez d'abord créer une instance:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Vous pouvez voir à quel point cela est redondant, car twice
il ne nécessite aucune donnée spécifique à l'instance.
object
en tant qu'instance nommée spécialeVous pouvez également utiliser le object
lui - même comme une instance spéciale d'une classe ou d'un trait. Lorsque vous faites cela, votre objet doit en étendre trait
afin de devenir une instance d'une sous-classe de celui-ci.
Considérez le code suivant:
object A extends B with C {
...
}
Cette déclaration déclare d'abord une classe anonyme (inaccessible) qui étend à la fois B
et C
et instancie une seule instance de cette classe nommée A
.
Cela signifie A
peut être passé aux fonctions qui attendent des objets de type B
ou C
, ou B with C
.
object
Il existe également des fonctionnalités spéciales des objets dans Scala. Je recommande de lire la documentation officielle .
def apply(...)
active la syntaxe sans nom de méthode habituelle de A(...)
def unapply(...)
permet de créer des extracteurs de correspondance de motifs personnalisés
Commerce
classe, mais la JVM et le langage Java le feront. (C'est ainsi que vous pouvez faireobject Foo{ def main(args:Seq[String]) }
et vous attendre à ce que le programme s'exécute.)A
class
est une définition, une description. Il définit un type en termes de méthodes et de composition d'autres types.An
object
est un singleton - une instance d'une classe qui est garantie d'être unique. Pour chaqueobject
élément du code, une classe anonyme est créée, qui hérite de toutes les classes que vous avez déclaréobject
implémenter. Cette classe ne peut pas être vue à partir du code source de Scala - bien que vous puissiez y accéder par la réflexion.Il existe une relation entre
object
etclass
. Un objet est dit être l'objet-compagnon d'une classe s'ils partagent le même nom. Lorsque cela se produit, chacun a accès à des méthodes deprivate
visibilité dans l'autre. Cependant, ces méthodes ne sont pas automatiquement importées. Vous devez soit les importer explicitement, soit les préfixer avec le nom de classe / objet.Par exemple:
la source
def f(x: X) = ???
, il pourrait alors appeler des méthodes privéesx
de la classe compagnonX
.Un objet a exactement une instance (vous ne pouvez pas appeler
new MyObject
). Vous pouvez avoir plusieurs instances d'une classe.Objet sert le même (et certains supplémentaires) fins que les méthodes statiques et les champs en Java.
la source
Comme cela a été expliqué par beaucoup,
object
définit une instance singleton. La seule chose dans les réponses ici qui, je crois, est omise, c'est qu'elleobject
sert à plusieurs fins.Il peut s'agir de l'objet compagnon d'un
class
/trait
, contenant ce qui pourrait être considéré comme des méthodes statiques ou des méthodes pratiques.Il peut agir un peu comme un module, contenant des définitions et des types associés / subsidiaires, etc.
Il peut implémenter une interface en étendant un
class
ou un ou plusieurstrait
s.Il peut représenter le cas d'un
sealed trait
qui ne contient aucune donnée. À cet égard, il est souvent considéré comme plus correct qu'uncase class
sans aucun paramètre. Le cas particulier d'unsealed trait
avec uniquement descase object
implémenteurs est plus ou moins la version Scala d'une énumération.Il peut servir de preuve à
implicit
une logique motivée.Il introduit un type singleton.
C'est une construction très puissante et générale. Ce qui peut être très déroutant pour les débutants de Scala, c'est que la même construction peut avoir des utilisations très différentes. Et un
object
peut servir plusieurs de ces différentes utilisations à la fois, ce qui peut être encore plus déroutant.la source
Définir un objet dans Scala, c'est comme définir une classe en Java qui n'a que des méthodes statiques. Cependant, dans Scala, un objet peut étendre une autre superclasse, implémenter des interfaces et être transmis comme s'il s'agissait d'une instance d'une classe. (C'est donc comme les méthodes statiques sur une classe mais en mieux).
la source
La différence formelle -
La différence d'utilisation:
object
. Vous pouvez l'utiliser avec ou sans classe associée. Dans le premier cas, il s'agit d'un objet compagnon. Vous devez:Pour créer un programme, vous devez utiliser la méthode principale dans
object
, pas dansclass
.Vous pouvez également l'utiliser comme vous utilisez un objet singleton en java.
la source
Le mot-clé object crée un nouveau type singleton, qui est comme une classe qui n'a qu'une seule instance nommée. Si vous connaissez Java, déclarer un objet dans Scala est un peu comme créer une nouvelle instance d'une classe anonyme.
Scala n'a pas d'équivalent au mot-clé statique de Java et un objet est souvent utilisé dans Scala où vous pouvez utiliser une classe avec des membres statiques en Java.
la source
L'objet est une classe mais il a déjà (est) une instance, vous ne pouvez donc pas appeler
new ObjectName
. D'un autre côté, Class est juste du type et peut être une instance en appelantnew ClassName()
.la source
En scala, il n'y a pas de
static
concept. Scala crée donc un objet singleton pour fournir un point d'entrée pour l'exécution de votre programme. Si vous ne créez pas d'objet singleton, votre code se compilera correctement mais ne produira aucune sortie. Les méthodes déclarées à l'intérieur de Singleton Object sont accessibles globalement. Un objet singleton peut étendre des classes et des traits.Exemple d'objet Scala Singleton
Production:
Dans scala, lorsque vous avez une classe portant le même nom que l'objet singleton, elle est appelée classe compagnon et l'objet singleton est appelé objet compagnon.
La classe compagnon et son objet compagnon doivent tous deux être définis dans le même fichier source.
Exemple d'objet compagnon Scala
Production:
En scala, une classe peut contenir:
1. Membre de données
2. Méthode des membres
3. Bloc constructeur
4. Classe imbriquée
5. Super informations sur la classe, etc.
Vous devez initialiser toutes les variables d'instance de la classe. Il n'y a pas de portée par défaut. Si vous ne spécifiez pas la portée d'accès, elle est publique. Il doit y avoir un objet dans lequel la méthode principale est définie. Il fournit un point de départ pour votre programme. Ici, nous avons créé un exemple de classe.
Exemple de classe Scala
Je suis désolé, je suis trop tard mais j'espère que cela vous aidera.
la source
Scala classe identique à Java Class mais scala ne vous donne aucune méthode d'entrée dans la classe, comme la méthode principale en java. La principale méthode associée au mot-clé objet. Vous pouvez considérer le mot clé object comme la création d'un objet singleton d'une classe définie implicitement.
plus d'informations consultez cette classe d' article et le mot-clé objet dans la programmation scala
la source
L'objet est similaire à la classe statique de Java dans une certaine mesure, la caractéristique statique signifie que la classe statique n'a pas besoin de créer un objet lors de la mise à la JVM, il peut être utilisé directement par son nom de classe et la même instance (même état de données ) est partagé partout où il est utilisé.
la source
Une classe est comme n'importe quelle autre classe dans d'autres langues. Vous définissez la classe comme n'importe quel autre langage avec une différence de syntaxe.
Cependant, objet est une classe avec un seul objet. Cela le rend intéressant car il peut être utilisé pour créer des membres statiques d'une classe à l'aide d'un objet compagnon . Cet objet compagnon a accès aux membres privés de la définition de classe et il porte le même nom que la classe que vous définissez.
En outre, il convient de noter que la classe d'objets est créée paresseusement, ce qui est un autre point important. Donc, ceux-ci ne sont instanciés que s'ils sont nécessaires dans notre code.
Si vous définissez la création de connexions pour JDBC, vous pouvez les créer à l'intérieur de l'objet pour éviter la duplication, comme nous le faisons en Java avec des objets singleton.
la source
Si vous venez de l'arrière-plan java, le concept de classe dans scala est un peu similaire à Java, mais la classe dans scala ne peut pas contenir de membres statiques.
Les objets dans scala sont de type singleton que vous appelez des méthodes à l'intérieur en utilisant le nom de l'objet, dans scala object est un mot-clé et dans java object est une instance de classe
la source