web-dev-qa-db-fra.com

Différence entre objet et classe en Scala

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?

553
Steve

tl; dr

  • 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.
  • s'il existe un 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 .

Utilisation en tant qu'hôte de membres statiques

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.

Utilisation comme instance nommée spéciale

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.

Fonctionnalités supplémentaires de 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 _
  • s'il accompagne une classe du même nom, l'objet assume un rôle spécial lors de la résolution de paramètres implicites
502
ziggystar

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
   }
}
237
Daniel C. Sobral

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. 

66
Thomas Jung

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 traits.

  • 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.

17
acjay

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).

15
Ken Bloom

La différence formelle - 

  1. vous ne pouvez pas fournir de paramètres de constructeur pour Objets
  2. Object n'est pas un type - vous ne pouvez pas créer d'instance avec un nouvel opérateur. Mais il peut avoir des champs, des méthodes, étendre une super classe et mélanger des traits. 

La différence d'utilisation:

  • Scala n'a pas de méthodes ni de champs statiques. Au lieu de cela, vous devriez utiliser object. Vous pouvez l'utiliser avec ou sans classe associée. Dans le 1er cas, cela s'appelle un objet compagnon. Vous devez:
    1. utiliser le même nom pour la classe et l'objet
    2. mettez-les dans le même fichier source. 
  • 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.

     

     

12
irudyak

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.

4
user2989087

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.

2
Bhaskar Das

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().

2
Yonggoo Noh

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

1
FOD

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

0
David

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.

0
Vivek

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.

0
Piyush P