0Pricing
Java Academy · Lektion

Eigene Methoden in Records

Fügen Sie Instanzmethoden und statische Factory-Methoden hinzu, um die Funktionalität von Records zu erweitern.

Eigene Methoden in Records ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Benutzerdefinierte Methoden in Records

Records können Instanzmethoden, statische Methoden und statische Felder enthalten – jedes Verhalten, das sich aus ihren Komponenten ableitet oder damit zusammenhängt.

Instanzmethoden in Records

Fügen Sie Records Methoden hinzu, um abgeleitete Werte zu berechnen oder nützliche Operationen auf Grundlage der Komponenten bereitzustellen.

record Money(long cents, String currency) {
    public double amount() { return cents / 100.0; }
    public String display() { return String.format("%s %.2f", currency, amount()); }
    public Money add(Money other) {
        if (!currency.equals(other.currency))
            throw new IllegalArgumentException("Currency mismatch");
        return new Money(cents + other.cents, currency);
    }
    public Money multiply(int factor) { return new Money(cents * factor, currency); }
}

Money price = new Money(1999, "USD");
Money tax = new Money(160, "USD");
System.out.println(price.add(tax).display()); // USD 21.59

Statische Factory-Methoden

Statische Factory-Methoden bieten benannte, gut lesbare Möglichkeiten zum Erstellen von Records – und verbergen den direkten Konstruktoraufruf, wenn dieser weniger verständlich ist.

import java.time.*;

record DateRange(LocalDate start, LocalDate end) {
    DateRange { if (start.isAfter(end)) throw new IllegalArgumentException(); }

    public static DateRange of(LocalDate start, LocalDate end) {
        return new DateRange(start, end);
    }

    public static DateRange thisMonth() {
        LocalDate now = LocalDate.now();
        return new DateRange(now.withDayOfMonth(1),
            now.withDayOfMonth(now.lengthOfMonth()));
    }

    public long durationDays() {
        return ChronoUnit.DAYS.between(start, end) + 1;
    }
}

System.out.println(DateRange.thisMonth().durationDays());

Prädikatsmethoden

Records stellen häufig boolesche Prädikatsmethoden bereit, um Bedingungen für die enthaltenen Daten zu prüfen.

record User(String email, String plan, boolean emailVerified) {
    public boolean isPro()      { return "PRO".equals(plan); }
    public boolean canPublish() { return isPro() && emailVerified; }
    public boolean isFree()     { return "FREE".equals(plan); }

    public User withPlan(String newPlan) {
        return new User(email, newPlan, emailVerified); // "update"
    }
}

User u = new User("alice@example.com", "FREE", true);
System.out.println(u.canPublish()); // false
User upgraded = u.withPlan("PRO");
System.out.println(upgraded.canPublish()); // true

Wither-Methoden (Copy-With)

Da Records unveränderlich sind, bedeutet „Aktualisieren“, einen neuen Record zu erstellen. Wither-Methoden folgen dem Muster withX(newValue).

record ServerConfig(String host, int port, boolean ssl, int timeout) {
    public ServerConfig withHost(String h)    { return new ServerConfig(h, port, ssl, timeout); }
    public ServerConfig withPort(int p)       { return new ServerConfig(host, p, ssl, timeout); }
    public ServerConfig withSsl(boolean s)    { return new ServerConfig(host, port, s, timeout); }
    public ServerConfig withTimeout(int t)    { return new ServerConfig(host, port, ssl, t); }
}

ServerConfig dev = new ServerConfig("localhost", 8080, false, 30);
ServerConfig prod = dev
    .withHost("api.example.com")
    .withPort(443)
    .withSsl(true)
    .withTimeout(60);
System.out.println(prod);

Records mit funktionalen Interfaces

Ein Record, der zusätzlich ein funktionales Interface implementiert, kann direkt als Ersatz für eine Lambda-Funktion übergeben werden.

import java.util.function.*;

record Validator<T>(Predicate<T> rule, String message)
    implements Predicate<T> {

    public boolean test(T value) { return rule.test(value); }

    public String validate(T value) {
        return test(value) ? null : message;
    }
}

Validator<String> notEmpty = new Validator<>(
    s -> !s.isBlank(), "Must not be blank");
Validator<String> validEmail = new Validator<>(
    s -> s.contains("@"), "Invalid email");

System.out.println(notEmpty.validate(""));        // Must not be blank
System.out.println(validEmail.validate("a@b.c")); // null (valid)

Aggregationsmethoden

Records, die Collections enthalten, können streambasierte Aggregationsmethoden bereitstellen.

import java.util.*;

record SalesReport(String region, List<Double> dailySales) {
    SalesReport { dailySales = List.copyOf(dailySales); }

    public double total()   { return dailySales.stream().mapToDouble(Double::doubleValue).sum(); }
    public double average() { return dailySales.stream().mapToDouble(Double::doubleValue).average().orElse(0); }
    public double max()     { return dailySales.stream().mapToDouble(Double::doubleValue).max().orElse(0); }
    public int    days()    { return dailySales.size(); }
}

SalesReport r = new SalesReport("North", List.of(1200.0, 1450.0, 980.0, 1600.0));
System.out.printf("Total: %.0f, Avg: %.0f, Max: %.0f%n", r.total(), r.average(), r.max());
// Total: 5230, Avg: 1307, Max: 1600

Benutzerdefinierte toString-Überschreibung

Die automatisch generierte toString-Methode eignet sich zwar gut zur Fehlersuche, für die Anzeige gegenüber Benutzern möchten Sie sie möglicherweise überschreiben.

record Temperature(double celsius) {
    @Override
    public String toString() {
        return String.format("%.1f\u00b0C / %.1f\u00b0F",
            celsius, toFahrenheit());
    }

    public double toFahrenheit() { return celsius * 9.0/5.0 + 32; }
    public double toKelvin()     { return celsius + 273.15; }

    public static Temperature fromFahrenheit(double f) {
        return new Temperature((f - 32) * 5.0/9.0);
    }
}

Temperature boiling = new Temperature(100.0);
System.out.println(boiling); // 100.0°C / 212.0°F

Records als Wertobjekte in DDD

Im Domain-Driven Design entsprechen Records auf natürliche Weise Wertobjekten – unveränderlichen Typen, die durch ihre Attribute und nicht durch ihre Identität definiert sind.

// Value objects in a banking domain
record AccountId(String value) {
    AccountId { if (!value.matches("ACC-[0-9]{8}")) throw new IllegalArgumentException(); }
}
record Amount(long cents, String currency) {
    public static Amount usd(long cents) { return new Amount(cents, "USD"); }
    public boolean isPositive() { return cents > 0; }
}
record TransactionId(java.util.UUID value) {
    public static TransactionId generate() {
        return new TransactionId(java.util.UUID.randomUUID());
    }
}

AccountId id = new AccountId("ACC-12345678");
Amount amount = Amount.usd(5000);
TransactionId txId = TransactionId.generate();
System.out.println(id + " " + amount + " " + txId);

Records mit Comparator vergleichen

Records können mithilfe von Comparator.comparing und Methodenreferenzen auf ihre Zugriffsmethoden sortiert werden.

import java.util.*;

record Employee(String name, String dept, double salary) {}

List<Employee> employees = List.of(
    new Employee("Alice",   "Engineering", 95000),
    new Employee("Bob",     "Marketing",   72000),
    new Employee("Charlie", "Engineering", 105000),
    new Employee("Diana",   "Marketing",   81000)
);

// Sort by dept, then salary descending
employees.stream()
    .sorted(Comparator.comparing(Employee::dept)
        .thenComparing(Comparator.comparingDouble(Employee::salary).reversed()))
    .forEach(e -> System.out.printf("%-10s %-15s %.0f%n",
        e.name(), e.dept(), e.salary()));

Statische Hilfsmethoden in Records

Records können statische Methoden enthalten, die mit mehreren Record-Instanzen arbeiten – nützlich für Transformationen und Vergleiche.

import java.util.*;
import java.util.stream.*;

record Product(String id, String category, double price) {
    public static Map<String, DoubleSummaryStatistics> statsByCategory(
            List<Product> products) {
        return products.stream().collect(
            Collectors.groupingBy(Product::category,
                Collectors.summarizingDouble(Product::price)));
    }

    public static Optional<Product> cheapest(List<Product> products) {
        return products.stream()
            .min(Comparator.comparingDouble(Product::price));
    }
}

Kurztest

Sie möchten ein Feld eines Records „aktualisieren“. Wie gehen Sie korrekt vor?

Zusammenfassung: Benutzerdefinierte Methoden in Records

Die wichtigsten Erkenntnisse:

  • Records können Instanzmethoden, statische Methoden und statische Felder enthalten
  • Fügen Sie berechnete Eigenschaften als Methoden hinzu (area(), total(), display())
  • Verwenden Sie statische Factory-Methoden für lesbare, benannte Konstruktoren
  • Implementieren Sie Wither-Methoden (withX) für unveränderliche Aktualisierungen
  • Überschreiben Sie toString() für die Anzeige gegenüber Benutzern statt für eine Debug-Ausgabe
  • Records entsprechen im Domain-Driven Design auf natürliche Weise Wertobjekten

Häufig gestellte Fragen

Ist die Lektion „Eigene Methoden in Records“ kostenlos?

Ja — der vollständige Text von „Eigene Methoden in Records“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Eigene Methoden in Records“?

Fügen Sie Instanzmethoden und statische Factory-Methoden hinzu, um die Funktionalität von Records zu erweitern. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Eigene Methoden in Records“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Records kennenlernen
  2. Kompakte Konstruktoren und Validierung
  3. Eigene Methoden in Records
  4. Records vs. Klassen vs. Lombok
← Zurück zu Java Academy