[JAVA] J'ai touché Scala ~ [Objet] ~

Introduction

image.png

Il s'agit d'une migration directe du didacticiel dwango, où vous allez l'étudier, le modifier et le remplacer par vos propres termes.

objet

Dans Scala, toutes les valeurs sont des objets. De plus, toutes les méthodes appartiennent à un objet. Par conséquent, il n'est pas possible de créer des champs statiques et des méthodes statiques appartenant à une classe comme le fait Java. Au lieu de cela, le mot-clé object vous permet de définir un objet singleton avec le même nom sous l'espace de noms actuel. Un objet singleton défini par le mot clé object peut avoir ses propres méthodes et champs définis.

L'utilisation principale de la syntaxe d'objet est

Emplacement des méthodes utilitaires et des états globaux (méthodes et champs statiques en Java) Méthode de fabrique pour les objets de même classe de nom Peut être mentionné.

La syntaxe de base de l'objet est presque la même que celle de la classe,

object <Nom de l'objet> extends <nom de la classe> (with <Nom Trate>)* {
  (<Définition du champ> | <Définition de la méthode>)*
}

Ce sera. Dans Scala, un objet appelé Predef est défini et importé par défaut, et cela s'applique à la première utilisation. La méthode que j'ai utilisée avec désinvolture avec println ("Hello") est en fait une méthode Predef. Vous pouvez hériter d'une classe avec des traits étendus et mix-in avec avec car vous pouvez souhaiter que le nom de l'objet se comporte comme une sous-classe d'une classe existante. Dans la bibliothèque standard de Scala, il y a un objet appelé Nil, qui hérite de List car nous voulons qu'il se comporte comme un type de List. D'un autre côté, les objets mélangent rarement des traits, ce qui semble être dû à la compatibilité syntaxique avec les classes et les traits.

D'un autre côté, pensons à la deuxième utilisation. Si vous essayez de créer une fabrique de la classe Point qui représente un point avec un objet, cela ressemblera à ceci: La méthode nommée apply est traitée spécialement par le processeur Scala, et s'il existe une description comme Point (x) et une méthode nommée apply est définie dans l'objet Point, Point.apply (x) Est interprété comme. En utilisant ceci pour créer un objet avec la méthode apply de l'objet Point, vous pouvez créer un objet avec une description telle que Point (3, 5).


scala> class Point(val x:Int, val y:Int)
defined class Point

scala> object Point {
     |   def apply(x: Int, y: Int): Point = new Point(x, y)
     | }
defined object Point
warning: previously defined class Point is not a companion to object Point.
Companions must be defined together; you may wish to use :paste mode for this.

Ceci est comparé à la création d'un objet Point directement avec le nouveau Point ().

Les détails d'implémentation de la classe (Point) peuvent être cachés à l'intérieur (seule l'interface est exposée à l'extérieur) Peut renvoyer une instance de cette sous-classe au lieu de Point Il y a des mérites tels que. Notez que la description ci-dessus est plus simple en utilisant la classe case.


scala> case class Point(x: Int, y: Int)
defined class Point

Peut être écrit. Les classes de cas apparaissent également dans la section de correspondance de modèle ci-dessous, mais je ne vais pas expliquer comment les utiliser ici. En termes simples, la classe case expose tous les champs du constructeur principal de la classe à laquelle elle est attachée et crée une classe qui remplace les méthodes de base de l'objet telles que equals (), hashCode (), toString (). Il crée également une méthode de fabrique pour créer une instance de cette classe. Par exemple, la classe Point définie dans la classe de cas Point (x: Int, y: Int) ne définit pas explicitement la méthode equals (),


Point(1, 2).equals(Point(1, 2))

La valeur évaluée pour est true.

Objet compagnon Les objets singleton définis avec le même nom dans le même fichier que la classe sont appelés objets compagnons. L'objet compagnon a un accès privilégié à la classe correspondante. Par exemple, si le poids est défini sur privé


class Person(name: String, age: Int, private val weight: Int)

object Hoge {
  def printWeight(): Unit = {
    val taro = new Person("Taro", 20, 70)
    println(taro.weight)
  }
}

Est NG,


class Person(name: String, age: Int, private val weight: Int)

object Person {
  def printWeight(): Unit = {
    val taro = new Person("Taro", 20, 70)
    println(taro.weight)
  }
}

Est OK. Notez que même les objets compagnons ne peuvent pas accéder aux membres des classes qui sont privées [this](accessibles uniquement à partir de cet objet). Si vous le rendez simplement privé, il sera accessible depuis l'objet compagnon.

Si vous voulez essayer du code avec des objets compagnons comme celui ci-dessus dans REPL, assurez-vous d'utiliser la commande REPL's: paste pour coller la classe et l'objet compagnon ensemble. La classe et l'objet compagnon doivent être dans le même fichier, mais si vous les entrez séparément dans REPL, REPL ne reconnaîtra pas correctement la relation compagnon.


scala> :paste
// Entering paste mode (ctrl-D to finish)

class Person(name: String, age: Int, private val weight: Int)

object Person {
  def printWeight(): Unit = {
    val taro = new Person("Taro", 20, 70)
    println(taro.weight)
  }
}

// Exiting paste mode, now interpreting.

defined class Person
defined object Person

Recommended Posts

J'ai touché Scala ~ [Objet] ~
J'ai touché Scala
J'ai touché Scala ~ [Classe] ~
J'ai touché Scala ~ [Trate] ~
J'ai touché Scala ~ [Syntaxe de contrôle] ~
J'ai d'abord touché Java ②
J'ai d'abord touché Java ③
J'ai d'abord touché Java ④
J'ai touché Scala ~ [Paramètres de type et spécification de déplacement] ~
J'ai d'abord touché Java
Je suis allé à Scala Fukuoka 2019!
J'ai essayé le mappeur d'objets de Cassandra pour Java
J'ai créé un serveur écologique avec scala
J'ai touché ODM for Developer ② Développement de règles