Schauen Sie sich Kotlin aus einer effektiven Java-Perspektive an

Dies ist der Artikel am 18. Tag von Kotlin Adventskalender 2017 (Veröffentlichung verzögert sich, Sumimasen: bow :)

Wenn Sie Kotlin aus der Perspektive von Effective Java betrachten, ein Muss für Java-Ingenieure, können Sie sehen, dass Kotlin sehr geschickt ist.

Schauen wir uns hier die Überschreibung von "equals" und "hashCode" der Elemente 8 und 9 von Effective Java Kapitel 3 an.

Überschreiben von equals und hashCode

Überblick

Sehen wir uns die Punkte 8 und 9 von Effective Java Kapitel 3 an. Ungefähr das Folgende ist geschrieben.

  1. Überschreiben Sie "gleich", wenn die Klasse das Konzept der logischen Äquivalenz haben soll.
  2. Die "Gleich" -Methode muss die folgenden allgemeinen Verträge erfüllen
  1. Wenn Sie equals überschreiben, müssen Sie auch hashCode überschreiben

Versuchen Sie, in Java zu implementieren

Als ich es in Java implementiert habe, habe ich es wie folgt implementiert.

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;
    }
}

Übrigens wurden "equals" und "hashCode" automatisch von IntelliJ generiert.

Übrigens, wenn es eine Änderung gibt, wie das Hinzufügen eines Feldes zur Klasse danach, können diese "gleich" und "hashCode" weiterhin die ursprünglich erwarteten Spezifikationen erfüllen? Es liegt am Implementierer und es ist ein Teil, den Sie bewusst schützen müssen: cry:

Versuchen Sie mit Kotlin zu implementieren

Was ist, wenn dies Kotlin ist?

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

Wenn Sie die Ihnen bekannte Datenklasse verwenden, ist dies in Ordnung: Lachen:

Lassen Sie uns dies dekompilieren.

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;
      }
   }
}


Sie haben "equals" und "hashCode" ordnungsgemäß erstellt. Und es scheint sich genauso zu verhalten wie der automatisch generierte Code in Java. .. .. Vielleicht. (Nicht bestätigt (´-`) .. oO (hashCode, NonNull-Feld wird ebenfalls auf null geprüft)

Auf diese Weise implementiert Kotlins "Datenklasse" automatisch "gleich" und "Hashcode", sodass es einfach erscheint, die ursprünglichen Spezifikationen beizubehalten, selbst wenn Sie Änderungen an der Klasse vornehmen.

Apropos

Durch Überschreiben von equals und hashCode fühlt es sich gut an, Lombok zu verwenden: heat_smile: (Es könnte interessant sein, die Funktionen von Lombok mit Kotlin zu vergleichen?)

Am Ende

Dieses Mal hatten wir nur "equals" und "hashCode", aber Kotlin hat immer noch einige sehr nützliche Funktionen zum Üben von Effective Java. Es kann interessant sein, einen Blick auf Kotlins Sprachfunktionen im Vergleich zu Effective Java zu werfen, da Sie sehen können, dass es ziemlich geschickt ist.

Übrigens, Effective Java wurde vor einiger Zeit veröffentlicht und es gibt einige alte Teile, aber wenn Sie interessiert sind, kommen Sie bitte und sehen Sie sich die 3. Ausgabe in Kürze an! https://www.amazon.co.jp/Effective-Java-3rd-Joshua-Bloch/dp/0134685997

Referenz

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

Schauen Sie sich Kotlin aus einer effektiven Java-Perspektive an
[Java] Schauen wir uns die Switch-Ausdrücke (Vorschau) von JDK 13 an.
Effektives Java-Element 25 Wählen Sie eine Liste aus einem Array aus. Erste Hälfte
Ein Blick auf Jenkins, OpenJDK 8 und Java 11
[Java] Ruft Werte zufällig aus einem Array ab
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
Java-Sprache aus der Sicht von Kotlin und C #
Schauen wir uns das Verfahren zum Starten der Hotspot-JVM an
Werfen wir einen Blick auf den Bildschirm von Quant Analyzer!
Holen Sie sich ganz einfach Ganzzahlen aus den Systemeigenschaften in Java
Von ineffektivem Java zu effektivem Java
Holen Sie sich mit Java eine nicht leere Sammlung aus einem optionalen Stream
Ein kurzer Rückblick auf Java in den letzten fünf Jahren
Einführung in Scala aus Java-Perspektive (grundlegend)
Lassen Sie uns die Java 8-Grammatik aus der Sicht der iOS-Ingenieure zusammenfassen
Führen Sie eine Batchdatei von Java aus
Greifen Sie über eine Java-Anwendung auf Teradata zu
Studiennotizen für einen Job bei einem IT-Unternehmen von unerfahrenen
Werfen Sie einen Blick darauf, wie Processing 3 funktioniert
Studieren Sie Docker erneut aus Sicht des Systembetriebs
Versuchen Sie, Kubernetes Job von Java aus auszuführen
Memo für die Migration von Java nach Kotlin
Wenn eine Person aus Java PHP lernt
Beim Verweisen auf Java-Klassen aus Kotlin kann es beim Erstellen zu einer ungelösten Referenz kommen
Werfen wir einen Blick auf die Funktionen der Keycloak-Verwaltungskonsole (Administrator Edition).