Kotlin's Class part.2 à envoyer aux développeurs Java

Visibilité

La visibilité de Java et Kotlin est légèrement différente.

Héritage

Définissons une classe Dog qui hérite de la classe Animal dans Kotlin.

open class Animal { //Ajouter open pour en faire une classe héritable
    open fun greet() { //Ajouter open pour en faire une fonction remplaçable
    }
}

class Dog: Animal() { //Deux points suivi du nom de la classe parente
    override fun greet() { //Ajouter un modificateur de remplacement
        println("Bow wow")
    }
}

Lors de l'héritage d'une classe class nom de sous-classe: Ecrire en tant que constructeur de superclasse.

Regardons le cas où le constructeur a besoin d'arguments.

open class Animal(val name: String) {
    open fun greet() {
    }
}

//Argument de constructeur de chien`name`Au constructeur de la classe Animal
class Dog(name: String): Animal(name) {
    override fun greet() {
        println("Bow wow")
    }
}

Objet compagnon

Kotlin n'a pas de modificateur statique.

Si vous souhaitez gérer les membres statiques et les fonctions statiques dans les classes Kotlin, Utilisez un objet compagnon.

Qu'est-ce qu'un objet compagnon? Une instance singleton spéciale.

class Dog {
    companion object {
        val ancestorName: String = "wolf"
    }

    fun greet() {
        println("Bow wow")
    }
}

val ancestor = Dog.ancestorName

J'ai défini une propriété appelée ʻancestorNamedansl'objet compagnon. Pour accéder à cette propriété, accédez à Dog.ancestorName` comme s'il s'agissait d'un membre statique.

déclaration d'objet

Kotlin dispose d'un mécanisme pour implémenter facilement un singleton.

object ResourceManager {
    fun clean() {
        // ...
    }   
}

ResourceManager.clean()

Vous pouvez définir une classe singleton en suivant le mot-clé ʻobject`. Vous pouvez définir des propriétés et des fonctions comme une classe régulière, Seul le constructeur ne peut pas être défini dans la déclaration d'objet. Utilisez le nom de la classe pour accéder à une instance de singleton. Similaire à l'accès aux membres statiques en Java.

classe de données

Vous implémentez souvent des classes simples pour stocker des données, non?

data class Point(val x : Int, 
                 val y: Int) {
}

Définissez la classe après le mot-clé data. La classe de données considère toutes les propriétés déclarées dans le constructeur principal avec les fonctions suivantes.

De plus, la fonction de copie est automatiquement générée. Il peut être copié tout en modifiant n'importe quelle propriété.

fun moveTo(point: Point, newX: Int): Point {
    return point.copy(x = newX)
}

Toutes les propriétés sont déclarées avec val et la classe est Immuable, Vous pouvez facilement générer une copie avec des valeurs réécrites.

classe scellée

La classe scellée est une classe qui ne peut être héritée que dans le même fichier.

sealed class Animal {
}

class Dog: Animal() {
}

class Cat: Animal() {
}
fun greet(animal: Animal) = when(animal) {
    is Dog -> "bow wow"
    is Cat -> "meow meow"
    // else ->Pas besoin d'autre cas!
}

Remarquez lorsque vous êtes dans la fonction d'accueil ci-dessus. Il n'y a pas d'autre cas. C'est l'effet de la classe scellée.

classe intérieure

En Java, lors de la définition d'une classe à l'intérieur d'une classe, la signification change selon que le modificateur statique est ajouté ou non. Comparons-le avec la méthode de description de Kotlin.

Java Kotlin
static class A class A
class A inner class A

Valeurs par défaut de Kotlin Synonyme de la classe imbriquée de Java avec «static».

Propriétés et champs de sauvegarde

Les propriétés Kotlin peuvent être déclarées sur une seule ligne, Il est possible de personnaliser respectivement le getter et le setter.

class Dog(name: String) {

    var name: String = name
        get() { //Getter personnalisé
            //Les variables de champ sont disponibles dans les getters
            //Ce getter est dans le nom"Chan"Retour avec
            return field + "Chan"
        }
        set(value) { //Sertisseur personnalisé
            //Setter spécifie le nom de l'argument
            //Ce setter supprime l'espace blanc à l'avant du nom et le définit dans le champ
            field = value.trimMargin()
        }

}

Déléguer

Les classes Kotlin ne peuvent pas être héritées par défaut. Il existe un mécanisme pour étendre la fonction sans héritage.

Avec une interface appelée Movable J'ai défini une classe MovableImpl qui implémente Movable.

interface Movable {
    fun walk()
    fun run()
    fun currentCount(): Int
}

class MovableImpl: Movable {

    private var count: Int = 0

    override fun walk() {
        this.count += 1
    }
    override fun run() {
        this.count += 3
    }
    override fun currentCount(): Int = this.count
}

Définissez une classe Dog qui étend les fonctionnalités de ce Movable.

class Dog(movable: MovableImpl): Movable by movable {

}

À la suite du mot-clé by, spécifiez l'instance à laquelle la fonctionnalité Movable est déléguée. Cette classe Dog n'a pas d'implémentation pour l'interface Movable, Il est automatiquement délégué à MovableImpl.

val dog = Dog(MovableImpl())
dog.walk()
dog.walk()
dog.run()

println(dog.currentCount()) // 5

Délégué de propriété

Vous pouvez déléguer le comportement des getters et des setters de propriété. Définissez une classe comme celle-ci.

class Dog {
    var name: String by NameFormatter()
}

class Cat {
    var name: String by NameFormatter()
}

Les classes Dog et Cat ont toutes deux une propriété appelée name. Les deux spécifient by suivi de NameFormatter. Essayez d'exécuter le code ci-dessous.

val dog = Dog()
dog.name = "Pochi"
println(dog.name) //Pochi-chan
val cat = Cat()
cat.name = "Marbre"
println(cat.name) //Tama-chan

Dans les deux cas, les espaces sont supprimés de la chaîne de caractères affectée au nom. Dans le getter, "chan" est ajouté comme suffixe.

Jetons maintenant un œil à l'implémentation de NameFormatter.

class NameFormatter {

    private var name: String = ""

    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return this.name + "Chan"
    }
    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        this.name = value.trimStart()
    }
}

Implémentez les méthodes getValue et setValue en suivant le mot-clé ʻoperator`.

De cette manière, le comportement de la propriété peut être délégué à l'extérieur.

Recommended Posts

Kotlin's Class part.2 à envoyer aux développeurs Java
Classe Kotlin à envoyer aux développeurs Java
Fonctions de portée Kotlin à envoyer aux développeurs Java
Fonctions Kotlin et lambdas à envoyer aux développeurs Java
Premiers pas avec Kotlin à envoyer aux développeurs Java
La sécurité Null de Kotlin à envoyer aux développeurs Java
Maîtriser Kotlin ~ Convertir un fichier Java en fichier Kotlin Road to Graduation ~ Partie 3
Maîtriser Kotlin ~ Convertir un fichier Java en fichier Kotlin Road to Graduation ~ Partie 2
Comment utiliser la classe Java
Maîtriser Kotlin ~ Convertir un fichier Java en fichier Kotlin Road to Graduation ~ Partie 1
Java pour apprendre avec les ramen [Partie 1]
Comment désassembler un fichier de classe Java
Comment décompiler un fichier de classe Java
Comment utiliser les méthodes de classe [Java]
Génériques Kotlin pour les développeurs Java
[Android] Convertir le code Java Android en Kotlin
[Java] Comment utiliser la classe Math
[Java] Comment utiliser la classe File
[Kotlin] Trois façons d'obtenir un cours depuis KClass
Convertir toutes les applications Android (Java) en Kotlin
Introduction à kotlin pour les développeurs iOS ⑥ ー création de kotlin
[Traitement × Java] Comment utiliser la classe
Java: Comment envoyer des valeurs du servlet au servlet
Comment utiliser la classe Java Scanner (Remarque)
Conseils d'interopérabilité avec Kotlin à envoyer aux développeurs Java
Création d'une classe de matrice dans Java Partie 1
Introduction à kotlin pour les développeurs iOS ④-type
[Java] Comment utiliser la classe Calendar
Mémo pour la migration de Java vers Kotlin
Java Beginner Escape Boot Camp Partie 1 Structure et écriture des classes Java
Exemple simple de rappel dans l'exemple de classe anonyme Java Part2
[Java] Héritage de classe
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
classe Scanner java
Classe Java HashMap
Présentation de Kotlin à un projet Java Maven existant
Je souhaite envoyer un e-mail en Java.
java (classe abstraite)
Migrer de Java vers Kotlin côté serveur + Spring-boot
Ingénieur en route vers Java Partie 1 Introduction et construction de l'environnement
Comment obtenir une classe depuis Element en Java
java pratique partie 1
Paramètres initiaux pour la réécriture de projets Java sur Kotlin
Comment convertir un contrat de solidité en une classe de contrat Java
[Java] Classe imbriquée
Classe anonyme Java
Introduction à kotlin pour les développeurs iOS ⑤-XML pratique
À propos de la classe Java
[Java] Introduction à Java
Introduction à kotlin pour les développeurs iOS ③-À propos de gradle
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
Introduction à Java
[java] Classe abstraite
[Java] Classe d'objets
Introduction à kotlin pour les développeurs iOS ①-Construction de l'environnement
Où les programmeurs Java ont tendance à trébucher sur Kotlin
Classe locale Java
Introduction à kotlin pour les développeurs iOS ②-Création de projet
Comment écrire Java String # getBytes dans Kotlin?