Wenn Sie records in Java bereits kennen, werden Sie feststellen, dass die Verwendung der von Klassen sehr ähnlich ist, es gibt jedoch wichtige Unterschiede, die berücksichtigt werden müssen. In diesem Artikel werden wir die Unterschiede zwischen Datensätzen und Klassen in Java sehen. Wenn Sie Datensätze immer noch nicht kennen, empfehle ich Ihnen, meinen Beitrag „Datensätze in Java: Was sie sind und wie man sie verwendet“ zu lesen.
Ein unveränderliches Objekt ist eines, dessen Attribute nach der Erstellung des Objekts nicht mehr geändert werden können. Im Fall von Datensätzen sind diese unveränderlich, d. h. sobald ein Objekt vom Typ Datensatz erstellt wurde, können seine Attribute nicht mehr geändert werden. Andererseits kann eine Klasse unveränderlich sein oder auch nicht, je nachdem, wie sie implementiert wird. Dieser Teil stellt die Integrität der Daten sicher und verhindert, dass sie versehentlich geändert werden.
Klassen werden im Allgemeinen einfach zum Speichern von Daten geschrieben, beispielsweise denen aus einer Datenbankabfrage oder den Daten aus einem Formular. In vielen Fällen sind diese Daten unveränderlich, da die Gültigkeit der Daten ohne Verwendung einer Synchronisierung sichergestellt werden muss. Um dies zu erreichen, wird eine Klasse mit den folgenden Elementen geschrieben:
Wenn Sie beispielsweise eine Person-Klasse mit den beiden Attributen „Name“ und „Nachname“ haben, könnten Sie diese wie folgt schreiben:
public class Person { private final String name; private final String lastName; public Person(String name, String lastName) { this.name = name; this.lastName = lastName; } public String getName() { return name; } public String getLastName() { return lastName; } @Override public String toString() { return "Person{" "name='" name '\'' ", lastName='" lastName '\'' '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person person)) return false; return Objects.equals(getName(), person.getName()) && Objects.equals(getLastName(), person.getLastName()); } @Override public int hashCode() { return Objects.hash(getName(), getLastName()); } }
Dies ist eine Lösung für die Aufgabe, aber es ist eine Menge Code für das, was tatsächlich benötigt wird. Wenn die Klasse mehr Attribute hätte, würde das Schreiben des Codes noch länger dauern, selbst wenn dies mit Hilfe einer IDE oder eines Plugins wie GitHub Copilot erfolgen würde. Eine bessere Lösung wäre, unsere Klasse als Datenklasse zu deklarieren, also als eine Klasse, die nur Daten speichert und kein bestimmtes Verhalten haben muss, und hier kommen records ins Spiel.
Auf diese Weise könnte die Person-Klasse wie folgt als Datensatz umgeschrieben werden:
public record Person(String name, String lastName) { }
Dadurch werden automatisch die Methoden „equals“, „hashCode“ und „toString“ sowie die Getter-Methoden für jedes der Attribute generiert.
Wenn eine unveränderliche Datenstruktur zum Speichern von Daten erforderlich ist und keine Änderungen an den Attributen vorgenommen werden müssen (es wird lediglich als Objekt zum Übertragen von Informationen betrachtet). Wenn Sie hingegen eine allgemeinere Struktur mit eindeutiger Logik und spezifischen Methoden, einen Ansatz für ein objektorientiertes Paradigma, die Anwendung von Entwurfsmustern oder die Arbeit mit JPA oder Hibernate usw. benötigen, sollten Sie eine Klasse verwenden.
Betrachten wir das folgende Beispiel: Es gibt zwei Datensätze „Product“ mit den Attributen „Name“ und „Preis“ und „Cart“ mit einem einzelnen Attribut „Products“ vom Typ ArrayList
package org.jordi.example; public record Product(String name, double price) { }
package org.jordi.example; import java.util.ArrayList; import java.util.List; public record Cart(Listproducts) { public Cart() { this(new ArrayList()); } public int getQuantity() { return this.products.size(); } public double getTotal() { return this.products.stream().mapToDouble(Product::price).sum(); } }
Das Problem in diesem Fall besteht darin, dass jeder der Datensätze für sich genommen unveränderlich ist, im Fall des Datensatzes Cart jedoch dadurch, dass er ein Attribut vom Typ ArrayList hat und eine ArrayList von Natur aus veränderbar ist , können Sie den Inhalt der Liste ändern, sobald der Datensatz Cart instanziiert ist.
package org.jordi.example; public class Main { public static void main(String[] args) { Product water = new Product("Water", 15); Product milk = new Product("Milk", 22); Cart cart = new Cart(); cart.products().add(water); cart.products().add(milk); System.out.println("Price: " cart.getTotal()); cart.products().clear(); System.out.println("Quantity: " cart.getQuantity()); System.out.println("Price: " cart.getTotal()); } }
Der obige Code lässt sich problemlos kompilieren, da nur der Inhalt der Liste geändert wird, das Produktattribut selbst jedoch nicht. Dies ist nur ein Beispiel für einen bestimmten Fall, der wahrscheinlich nicht notwendig ist, aber es ist gut zu wissen, dass dies möglich ist.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3