„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Datensätze vs. Klassen in Java

Datensätze vs. Klassen in Java

Veröffentlicht am 02.11.2024
Durchsuche:170

Records vs Clases en Java

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.

Unveränderlichkeit

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.

Zweck

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:

  • Private Attribute für jedes Feld.
  • Getter für jedes Feld.
  • Ein Konstruktor, der alle Felder initialisiert.
  • Eine Gleichheitsmethode, die Objekte auf Gleichheit vergleicht.
  • Eine HashCode-Methode, die einen Hash-Code basierend auf den Feldern generiert.
  • Eine toString-Methode, die eine String-Darstellung der Felder generiert.

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.

Was sind die Unterschiede zwischen einem Datensatz und einer Klasse?

  • Unveränderlichkeit: Datensätze sind unveränderlich, d. h. sobald ein Objekt vom Typ Datensatz erstellt wurde, können seine Attribute nicht mehr geändert werden. Stattdessen kann eine Klasse unveränderlich sein oder auch nicht, je nachdem, wie sie implementiert wurde.
  • Generierte Methoden: Die records generieren automatisch die Methoden equal, hashCode und toString sowie die Getter-Methoden für jedes der Attribute. In Klassen müssen diese Methoden jedoch manuell oder mit Hilfe einer IDE implementiert werden.
  • Verwendung in OOP: Datensätze können nicht von anderen Klassen erben oder durch andere Klassen erweitert werden, sie können jedoch Schnittstellen implementieren. Andererseits können Klassen von anderen erben, erweitert werden und sind im Allgemeinen ideal, um die Konzepte der objektorientierten Programmierung abzudecken.
  • Syntax: Die Syntax eines Datensatzes ist einfacher als die einer Klasse, da sie in einer einzigen Zeile definiert werden kann, während eine Klasse mehrere Codezeilen erfordert.
  • Zweck: Die Datensätze sind eine Struktur, die einem DTO (Data Transfer Object) ähnelt, also einer Klasse, die dabei hilft, unveränderliche Daten zu modellieren, ihrerseits eine Klasse ist eine allgemeinere Struktur, die Verhalten und Zustand haben kann.

Wann sollte ein Datensatz und wann eine Klasse verwendet werden?

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.

Extra: Mit veränderlichen Attributen aufzeichnen

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 sowie einige Methoden, um die Anzahl der Produkte und die Gesamtsumme des Warenkorbs zu ermitteln.

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(List products) {

    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.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/asjordi/records-vs-clases-en-java-1bb6?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

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