Je viens de passer en revue des didacticiels 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 difference entre class
et object
en Scala?
class C
définit une classe, comme en Java ou en C++.object O
crée un singleton objet O
en tant qu'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 alors passer O
n'importe où, une T
est attendue.class C
, alors object C
est l'objet objet compagnon de la classe C
; notez que l'objet compagnon est not automatiquement une instance de C
.Voir également la documentation Scala pour objet et classe .
Le plus souvent, vous avez besoin de object
pour contenir les méthodes et les valeurs/variables disponibles sans avoir à instancier au préalable une instance d'une classe . Cette utilisation est étroitement liée aux membres static
en Java.
object A {
def twice(i: Int): Int = 2*i
}
Vous pouvez ensuite appeler la méthode ci-dessus à l'aide de A.twice(2)
.
Si twice
était 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 en quoi cela est redondant, car twice
ne nécessite aucune donnée spécifique à une instance.
Vous pouvez également utiliser la object
elle-même en tant qu'instance spéciale d'une classe ou d'un trait . Lorsque vous faites cela, votre objet doit étendre une trait
afin de devenir une instance d'une sous-classe.
Considérons le code suivant:
object A extends B with C {
...
}
Cette déclaration déclare d'abord une classe anonyme (inaccessible) qui étend B
et C
et instancie une seule instance de cette classe nommée A
.
Cela signifie que A
peut être passé aux fonctions qui attendent des objets de type B
ou C
ou B with C
.
object
Il existe également des particularités des objets dans Scala. Je recommande de lire le documentation officielle _.
def apply(...)
active la syntaxe habituelle sans nom de méthode de A(...)
def unapply(...)
permet de créer une correspondance de motif personnalisée extracteurs _Une class
est une définition, une description. Il définit un type en termes de méthodes et de composition d'autres types.
Un object
est un singleton - une instance d'une classe dont l'un des éléments est garanti. Pour chaque object
du code, une classe anonyme est créée. Elle hérite des classes que vous avez déclarées object
à implémenter. Cette classe ne peut pas être vue à partir du code source Scala - bien que vous puissiez y accéder par réflexion.
Il existe une relation entre object
et class
. Un objet est dit être l'objet compagnon d'une classe s'il partage le même nom. Lorsque cela se produit, chacun a accès aux méthodes de visibilité private
de l'autre. Ces méthodes ne sont toutefois pas automatiquement importées. Vous devez soit les importer explicitement, soit les préfixer avec le nom de classe/objet.
Par exemple:
class X {
// class X can see private members of object X
// Prefix to call
def m(x: Int) = X.f(x)
// Import and use
import X._
def n(x: Int) = f(x)
private def o = 2
}
object X {
private def f(x: Int) = x * x
// object X can see private members of class X
def g(x: X) = {
import x._
x.o * o // fully specified and imported
}
}
Un objet a exactement one instance (vous ne pouvez pas appeler new MyObject
). Vous pouvez avoir plusieurs instances d'une classe.
Object sert les mêmes (et quelques autres) fins que les méthodes et champs statiques en Java.
Comme beaucoup l'ont expliqué, object
définit une instance singleton. La seule chose dans les réponses que je crois être laissée de côté est que object
sert à plusieurs fins.
Il peut s'agir de l'objet compagnon de class
/trait
, contenant ce que l'on pourrait considérer comme des méthodes statiques ou des méthodes pratiques.
Il peut ressembler beaucoup à un module, contenant des types et définitions apparentés/subsidiaires, etc.
Il peut implémenter une interface en étendant un class
ou un ou plusieurs trait
s.
Il peut représenter un cas d'un sealed trait
qui ne contient aucune donnée. À cet égard, il est souvent considéré comme plus correct qu'un case class
sans paramètre. Le cas particulier d'un sealed trait
avec seulement case object
développeurs est plus ou moins la version Scala d'un enum.
Cela peut servir de preuve pour la logique pilotée par implicit
.
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 en Scala, c’est que la même construction peut avoir des utilisations très différentes. Et un object
peut servir simultanément à plusieurs de ces utilisations différentes, ce qui peut être encore plus déroutant.
Définir un objet dans Scala revient à définir une classe en Java qui ne comporte que des méthodes statiques. Cependant, dans Scala, un objet peut étendre une autre super-classe, implémenter des interfaces et être transmis comme s'il s'agissait d'une instance d'une classe. (Donc, c'est comme les méthodes statiques sur une classe mais en mieux).
La différence formelle -
La différence d'utilisation:
object
. Vous pouvez l'utiliser avec ou sans classe associée. Dans le 1er cas, cela s'appelle un objet compagnon. Vous devez:Pour créer un programme, vous devez utiliser la méthode principale dans object
et non dans class
.
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
Vous pouvez également l'utiliser lorsque vous utilisez un objet singleton en Java.
Le mot clé object crée un nouveau type singleton, qui ressemble à une classe qui ne possède qu'une seule instance nommée. Si vous êtes familier avec Java, déclarer un objet dans Scala ressemble beaucoup à la création d’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.
En scala, il n'y a pas de concept static
. 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 sera compilé avec succès, mais ne produira aucune sortie. Les méthodes déclarées dans Singleton Object sont accessibles globalement. Un objet singleton peut étendre des classes et des traits.
Exemple d'objet Scala Singleton
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
Sortie:
Hello, This is Singleton Object
Dans scala, lorsque vous avez une classe portant le même nom qu'un objet singleton, elle est appelée classe associée 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
class ComapanionClass{
def hello(){
println("Hello, this is Companion Class.")
}
}
object CompanoinObject{
def main(args:Array[String]){
new ComapanionClass().hello()
println("And this is Companion Object.")
}
}
Sortie:
Hello, this is Companion Class.
And this is Companion Object.
En scala, une classe peut contenir:
1. Membre de données
2. Méthode membre
3. Bloc constructeur
4. Classe imbriquée
5. 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
class Student{
var id:Int = 0; // All fields must be initialized
var name:String = null;
}
object MainObject{
def main(args:Array[String]){
var s = new Student() // Creating an object
println(s.id+" "+s.name);
}
}
Je suis désolé, je suis trop tard mais j'espère que cela vous aidera.
Object est une classe mais elle a déjà une instance, vous ne pouvez donc pas appeler new ObjectName
. D'autre part, Class est simplement un type et il peut s'agir d'une instance en appelant new ClassName()
.
La classe Scala est identique à la classe Java mais scala ne vous donne aucune méthode d'entrée en classe, comme la méthode principale en Java. La méthode principale associée au mot-clé object. 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 cet article mot clé class and object dans la programmation scala
L'objet est égal à la classe statique en Java sur certaines étendues, les caractéristiques statiques signifient que la classe statique n'a pas besoin de créer un objet lors de la mise à la JVM, elle peut être utilisée directement par son nom de classe
Si vous venez du contexte Java, le concept de classe dans scala est un peu similaire à Java, mais la classe dans scala cant contient des membres statiques.
Les objets dans scala sont de type singleton et vous appelez des méthodes à l'aide de nom d'objet. Dans scala, l'objet est un mot clé et dans Java, un objet est une instance de classe.
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.
class Person(val name: String)
val me = new Person("My name")
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 en utilisant objet compagnon. Cet objet compagnon a accès aux membres privés de la définition de classe et porte le même nom que la classe que vous définissez.
class Person(var name: String) {
import Person._
def hi(): String = sayHello(name)
}
object Person {
private def sayHello(name: String): String = "Hello " + name
}
val me = new Person("My name")
me.hi()
En outre, il convient de noter que la classe d'objets est créée paresseusement, ce qui est un autre point important. Donc, celles-ci ne sont instanciées que si elles sont nécessaires dans notre code.
Si vous définissez la création de connexion pour JDBC, vous pouvez les créer à l'intérieur d'un objet pour éviter les doublons, comme nous le faisons dans Java avec des objets singleton.