Jetez un œil à Kotlin dans une perspective Java efficace

Ceci est l'article sur le 18ème jour du Calendrier de l'Avent Kotlin 2017 (La publication est retardée, Sumimasen: arc :)

Si vous regardez Kotlin du point de vue de Effective Java, une lecture incontournable pour les ingénieurs Java, vous pouvez voir que Kotlin est très astucieux.

Ici, jetons un coup d'œil à ʻequalsethashCode` Override des éléments 8 et 9 de Effective Java Chapter 3.

Remplacer ʻequalsethashCode`

Aperçu

Passons en revue les éléments 8 et 9 du chapitre 3 de Effective Java. En gros, ce qui suit est écrit.

  1. Remplacez ʻequals` si vous voulez que la classe ait le concept d'équivalence logique.
  2. La méthode «à égalité» doit répondre aux contrats généraux suivants --Réfléchissant, contrasté, transitionnel, cohérent, non nul x vs. x.equals (null) ʻis false` * Si vous voulez en savoir plus, vous pouvez trouver des informations par google. Essayez: arc:
  3. Si vous remplacez ʻequals, vous devez également remplacer hashCode`

Essayez de mettre en œuvre en Java

Lorsque je l'ai implémenté en Java, je l'ai implémenté comme suit.

public class DataA {
    @NotNull
    private final String a;
    @NotNull
    private final String b;
    @Nullable
    private final String c;

    public DataA(@NotNull String a, @NotNull String b, @Nullable String c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        DataA dataA = (DataA) o;

        if (!a.equals(dataA.a)) return false;
        if (!b.equals(dataA.b)) return false;
        return c != null ? c.equals(dataA.c) : dataA.c == null;
    }

    @Override
    public int hashCode() {
        int result = a.hashCode();
        result = 31 * result + b.hashCode();
        result = 31 * result + (c != null ? c.hashCode() : 0);
        return result;
    }
}

Au fait, ʻequalsethashCode` ont été automatiquement générés par IntelliJ.

Au fait, s'il y a un changement tel que l'ajout d'un champ à la classe après cela, ces ʻequalsethashCode` peuvent-ils continuer à répondre aux spécifications initialement attendues? C'est à l'implémenteur, et c'est une partie que vous devez consciemment protéger: pleurez:

Essayez de mettre en œuvre avec Kotlin

Et si c'était Kotlin?

data class DataB(
        val a: String,
        val b: String,
        val c: String?
)

Si vous utilisez la classe de données que vous connaissez, c'est OK

Décompilons ça.

public final class DataB {
   @NotNull
   private final String a;
   @NotNull
   private final String b;
   @Nullable
   private final String c;

   ...

   public int hashCode() {
      return ((this.a != null ? this.a.hashCode() : 0) * 31 + (this.b != null ? this.b.hashCode() : 0)) * 31 + (this.c != null ? this.c.hashCode() : 0);
   }

   public boolean equals(Object var1) {
      if (this != var1) {
         if (var1 instanceof DataB) {
            DataB var2 = (DataB)var1;
            if (Intrinsics.areEqual(this.a, var2.a) && Intrinsics.areEqual(this.b, var2.b) && Intrinsics.areEqual(this.c, var2.c)) {
               return true;
            }
         }

         return false;
      } else {
         return true;
      }
   }
}


Vous avez correctement ʻequals et hashCode. Et il semble se comporter de la même manière que le code généré automatiquement en Java. .. .. Peut-être. (Pas confirmé (´-) .. oO (hashCode, le champ NonNull est également vérifié pour null)

De cette façon, la classe de données de Kotlin implémente automatiquement ʻequals et hashCode`, il semble donc facile de conserver les spécifications d'origine même si vous apportez des modifications à la classe.

Au fait

Les Overrides ʻEquals et hashCode` permettent d'utiliser Lombok: sweat_smile: (Il pourrait être intéressant de comparer les fonctionnalités de Lombok avec Kotlin?)

À la fin

Cette fois, nous n'avions que ʻequals et hashCode`, mais Kotlin a encore des fonctionnalités très utiles pour pratiquer le Java efficace. Il peut être intéressant de jeter un œil aux fonctionnalités du langage de Kotlin par rapport à Effective Java, car vous pouvez voir que c'est assez astucieux.

Au fait, Effective Java a été publié il y a un certain temps et il y a quelques anciennes parties, mais si vous êtes intéressé, venez voir la 3e édition bientôt! https://www.amazon.co.jp/Effective-Java-3rd-Joshua-Bloch/dp/0134685997

référence

https://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=VF4RXTQQV4QXR9KD78S0

Recommended Posts

Jetez un œil à Kotlin dans une perspective Java efficace
[Java] Jetons un coup d'œil aux expressions de commutation (aperçu) du JDK 13.
Élément Java effectif 25 Sélectionnez une liste dans un tableau Première moitié
Un regard sur Jenkins, OpenJDK 8 et Java 11
[Java] Récupère des valeurs de manière aléatoire dans un tableau
Appeler une méthode avec le bloc de rappel de Kotlin depuis Java
Langage Java du point de vue de Kotlin et C #
Jetons un coup d'œil à la procédure de démarrage de la JVM Hotspot
Jetons un coup d'œil à l'écran de Quant Analyzer!
Obtenez facilement des entiers à partir des propriétés système en Java
De Java inefficace à Java efficace
Obtenir une collection non vide à partir d'un flux facultatif avec java
Retour rapide sur Java au cours des cinq dernières années
Introduction à Scala du point de vue Java (basique)
Résumons la grammaire Java 8 du point de vue des ingénieurs iOS
Exécuter le fichier de commandes à partir de Java
Accéder à Teradata depuis une application Java
Notes d'étude pour obtenir un emploi dans une entreprise informatique par des personnes inexpérimentées
Jetez un œil au fonctionnement de Processing 3
Réétudier Docker du point de vue du fonctionnement du système
Essayez d'exécuter Kubernetes Job à partir de Java
Mémo pour la migration de Java vers Kotlin
Si une personne de Java apprend PHP
Une référence non résolue peut se produire au moment de la construction lors du référencement des classes Java à partir de Kotlin
Jetons un coup d'œil aux fonctions de la console de gestion Keycloak (édition administrateur)