Java Academy · Lektion

Utility-Klassen und statische Factory-Methoden

Entwerfen Sie nicht instanziierbare Utility-Klassen und stellen Sie statische Factory-Methoden als Alternative zu Konstruktoren bereit.

Lektion 4 von 413 Schritte

Utility-Klassen und statische Factory-Methoden ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Utility-Klassen und statische Factory-Methoden

Utility-Klassen stellen statische Hilfsmethoden ohne Instanzzustand bereit. Statische Factory-Methoden sind benannte Alternativen zu Konstruktoren und bieten bessere Lesbarkeit, Caching und Flexibilität.

Utility-Klassen

Eine Utility-Klasse hat keinen Instanzzustand – sie ist ein Container für statische Methoden. Machen Sie sie durch einen privaten Konstruktor nicht instanziierbar.

final class StringUtils {
    // Private constructor prevents instantiation
    private StringUtils() {
        throw new UnsupportedOperationException("Utility class");
    }

    public static boolean isBlank(String s) {
        return s == null || s.strip().isEmpty();
    }

    public static String capitalize(String s) {
        if (isBlank(s)) return s;
        return Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase();
    }
}

System.out.println(StringUtils.isBlank("  ")); // true
System.out.println(StringUtils.capitalize("hELLO")); // Hello

Utility-Klassen der Standardbibliothek

Die Java-Standardbibliothek enthält zahlreiche Utility-Klassen: Collections, Arrays, Objects, Files, Paths und Math.

import java.util.*;

List<Integer> nums = new ArrayList<>(Arrays.asList(5, 2, 8, 1, 9, 3));

Collections.sort(nums);
System.out.println(nums); // [1, 2, 3, 5, 8, 9]

System.out.println(Collections.min(nums)); // 1
System.out.println(Collections.max(nums)); // 9

Collections.shuffle(nums); // random order

int[] arr = {3, 1, 4, 1, 5};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [1, 1, 3, 4, 5]
System.out.println(Arrays.binarySearch(arr, 4)); // 3 (index)

Statische Factory-Methoden

Eine statische Factory-Methode ist eine benannte statische Methode, die eine Instanz erstellt und zurückgibt. Vorteile: aussagekräftige Namen, Rückgabe gecachter Instanzen oder Instanzen eines Subtyps und Möglichkeit, null zurückzugeben.

class Connection {
    private final String host;
    private final int port;
    private final boolean ssl;

    private Connection(String host, int port, boolean ssl) {
        this.host = host; this.port = port; this.ssl = ssl;
    }

    // Named factory methods — more expressive than constructors
    public static Connection plain(String host) {
        return new Connection(host, 80, false);
    }
    public static Connection secure(String host) {
        return new Connection(host, 443, true);
    }
}
Connection c = Connection.secure("api.example.com");
// Much clearer than: new Connection("api.example.com", 443, true)

Caching mit statischer Factory

Statische Factory-Methoden können gecachte Instanzen zurückgeben und dadurch wiederholte Allokationen für häufig verwendete Werte vermeiden (wie es Integer.valueOf für -128..127 tut).

class Color {
    private static final Map<String, Color> CACHE = new HashMap<>();

    public final int r, g, b;

    private Color(int r, int g, int b) {
        this.r = r; this.g = g; this.b = b;
    }

    public static Color of(int r, int g, int b) {
        String key = r + "," + g + "," + b;
        return CACHE.computeIfAbsent(key, k -> new Color(r, g, b));
    }

    public static final Color RED   = of(255, 0, 0);
    public static final Color GREEN = of(0, 255, 0);
    public static final Color BLUE  = of(0, 0, 255);
}
System.out.println(Color.of(255,0,0) == Color.RED); // true (cached)

Factory vs. Konstruktor: Benennung

Übliche Namenskonventionen für statische Factory-Methoden:

  • of — Factory für eine Zusammenstellung
  • from — konvertierende Factory
  • valueOf — konvertierende Factory (ältere APIs)
  • getInstance — Singleton
  • create/newInstance — neues Objekt
  • get — flexibel
// Java API examples:
Optional.of(value)               // of
LocalDate.from(temporal)         // from
Integer.valueOf(42)              // valueOf
Calendar.getInstance()           // getInstance
Array.newInstance(type, length)  // newInstance

// Your own:
HttpRequest.post("https://api.example.com/users")
ApiResponse.error(404, "Not found")
Payment.creditCard("4242...", 9999, "USD")

Subtypen zurückgeben

Eine Factory-Methode kann einen Subtyp zurückgeben, während der deklarierte Rückgabetyp das Interface ist. Aufrufer sind von der konkreten Implementierung entkoppelt.

interface Validator<T> {
    boolean validate(T value);
    String errorMessage();
}

class EmailValidator implements Validator<String> {
    public boolean validate(String email) { return email.contains("@"); }
    public String errorMessage() { return "Invalid email address"; }
}

class Validators {
    // Returns interface type — hides implementation
    public static Validator<String> email() { return new EmailValidator(); }
    public static Validator<String> notBlank() {
        return new Validator<>() {
            public boolean validate(String s) { return s != null && !s.isBlank(); }
            public String errorMessage() { return "Value required"; }
        };
    }
}

Builder über eine statische Factory

Kombinieren Sie einen privaten Konstruktor mit einer statischen Factory und einem verschachtelten Builder zur Erstellung komplexer Objekte.

class EmailMessage {
    private final String to, subject, body;
    private final boolean html;

    private EmailMessage(Builder b) {
        this.to = b.to; this.subject = b.subject;
        this.body = b.body; this.html = b.html;
    }

    public static Builder builder(String to) { return new Builder(to); }

    public static class Builder {
        private final String to;
        private String subject = "", body = "";
        private boolean html = false;

        Builder(String to) { this.to = to; }
        public Builder subject(String s) { this.subject = s; return this; }
        public Builder body(String b) { this.body = b; return this; }
        public Builder html() { this.html = true; return this; }
        public EmailMessage build() { return new EmailMessage(this); }
    }
}
EmailMessage.builder("alice@co.com").subject("Welcome!").html().build();

Validierung in Factory-Methoden

Factory-Methoden eignen sich hervorragend zur Validierung von Eingaben vor der Erstellung – werfen Sie aussagekräftige Ausnahmen mit Kontext.

class PortNumber {
    private final int value;

    private PortNumber(int value) { this.value = value; }

    public static PortNumber of(int port) {
        if (port < 1 || port > 65535)
            throw new IllegalArgumentException(
                "Port must be 1-65535, got: " + port);
        return new PortNumber(port);
    }

    public static PortNumber http()  { return new PortNumber(80); }
    public static PortNumber https() { return new PortNumber(443); }

    public int value() { return value; }
    public boolean isPrivileged() { return value < 1024; }
}
System.out.println(PortNumber.https().isPrivileged()); // true

Collections-API: Statische Factory-Methoden

Java 9+ hat List.of(), Set.of() und Map.of() hinzugefügt – statische Factory-Methoden, die unveränderliche Collections erstellen.

import java.util.*;

List<String> fruits = List.of("Apple", "Banana", "Cherry");
Set<Integer> ids    = Set.of(1, 2, 3, 4, 5);
Map<String, Integer> ages = Map.of("Alice", 30, "Bob", 25);

// All are unmodifiable:
try {
    fruits.add("Durian"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
    System.out.println("Cannot modify!");
}

// Map.entry and Map.ofEntries for > 10 entries
Map<String, String> config = Map.ofEntries(
    Map.entry("host", "localhost"),
    Map.entry("port", "8080")
);

Wann Factory-Methoden vorzuziehen sind

Bevorzugen Sie statische Factory-Methoden gegenüber Konstruktoren, wenn:

  • Sie einen aussagekräftigen Namen wünschen
  • Die Factory möglicherweise eine gecachte Instanz oder eine Instanz eines Subtyps zurückgibt
  • Eine Validierung vor der Erstellung erforderlich ist
  • Sie die Anzahl der Instanzen steuern möchten (Singleton, Pool)
// Constructor: hard to know what this means
new Complex(0.5, -1.2);

// Factory: clear meaning
Complex.fromPolar(1.3, Math.PI / 4); // polar form
Complex.rectangular(0.5, -1.2);      // rectangular form

// Constructor: no caching
new Boolean(true); // deprecated — creates new object!

// Factory: returns cached instance (Boolean.TRUE or FALSE)
Boolean.valueOf(true); // returns Boolean.TRUE singleton

Schnelltest

Was ist der wichtigste Vorteil einer statischen Factory-Methode gegenüber einem öffentlichen Konstruktor?

Zusammenfassung: Utility-Klassen und statische Factory-Methoden

Die wichtigsten Erkenntnisse:

  • Utility-Klassen: finale Klasse mit privatem Konstruktor und ausschließlich statischen Methoden
  • Statische Factory-Methoden sind benannte Alternativen zu Konstruktoren
  • Übliche Namen: of, from, valueOf, getInstance, create, newInstance
  • Factories können gecachte Instanzen zurückgeben – siehe Integer.valueOf(-128..127)
  • Factories können Subtypen zurückgeben und dabei die konkrete Implementierung verbergen
  • Verwenden Sie für komplexe Konstruktionen mit mehreren Parametern Builder innerhalb von Factories
Kostenlos starten

Lerne Java mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
104
Lektionen
374

Häufig gestellte Fragen

Ist die Lektion „Utility-Klassen und statische Factory-Methoden“ kostenlos?

Ja — der vollständige Text von „Utility-Klassen und statische Factory-Methoden“ 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 „Utility-Klassen und statische Factory-Methoden“?

Entwerfen Sie nicht instanziierbare Utility-Klassen und stellen Sie statische Factory-Methoden als Alternative zu Konstruktoren bereit. 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 4 von 4.

Wie lange dauert die Lektion „Utility-Klassen und statische Factory-Methoden“?

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. Regeln für Methodenüberladung
  2. Varargs-Parameter
  3. Statische Felder und Konstanten
  4. Utility-Klassen und statische Factory-Methoden
← Zurück zu Java Academy