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 à ʻequalset
hashCode` Override des éléments 8 et 9 de Effective Java Chapter 3.
et
hashCode`Passons en revue les éléments 8 et 9 du chapitre 3 de Effective Java. En gros, ce qui suit est écrit.
x
vs. x.equals (null) ʻis
false` * Si vous voulez en savoir plus, vous pouvez trouver des informations par google. Essayez: arc:, vous devez également remplacer
hashCode`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, ʻequalset
hashCode` 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 ʻequalset
hashCode` 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:
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.
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?)
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
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