ProgrammierungBackend-Entwickler

Was ist eine 'inline class' (value class) in Kotlin? Wofür sind sie nützlich, wie verwendet man sie richtig, welche Einschränkungen und Eigenschaften haben solche Klassen? Geben Sie Beispielcode an.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

inline class (ab Kotlin 1.5 — value class) ermöglicht es, Wrapper um Primitivtätern zu erstellen, ohne zur Laufzeit separate Objekte zu erzeugen. Dies wird verwendet, um die Typensicherheit zu erhöhen, ohne die Kosten für die Speicherallokation. Unter der Haube können solche Objekte in das entsprechende Primitive kompiliert werden.

Beispiel:

@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
  • Nur eine Eigenschaft (Hauptfeld) ist erlaubt.
  • Konstruktore ohne Argumente sind nicht möglich.
  • Die Klasse kann keinen Zustand enthalten (z.B. var-Felder), nur val.
  • Man kann keine anderen Klassen erweitern, aber man kann Interfaces implementieren.
  • Interaktion mit Java-Code kann nicht immer intuitiv sein — es kann zu Boxing/Unboxing kommen.

Die Verwendung von inline/value Klassen ist wichtig für die Typisierung von Identifikatoren, Geld, Maßeinheiten usw.

Fangfrage

Kann eine value class mehr als eine Eigenschaft haben?

Antwort: Nein. Eine Value Class kann nur eine Property im primären Konstruktor enthalten.

Beispiel falschen Codes:

@JvmInline value class Money(val amount: Int, val currency: String) // Kompilierungsfehler

Beispiele realer Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

In einer Währungswechselstube wurden inline Klassen verwendet, um Betrag und Währung zu beschreiben. Sie versuchten, zwei Felder in die value class aufzunehmen, erhielten einen Kompilierungsfehler und verbrachten einige Zeit mit dem Versuch, die Einschränkung zu umgehen. Schließlich entschieden sie sich, eine separate Datenklasse zu erstellen.


Geschichte

Bei der Integration mit einer externen Java-Bibliothek wurde die inline class manchmal unerwartet in ein Objekt (Boxing) umgewandelt, was die Leistung beeinflusste. Nach Analyse der Dokumentation ersetzten sie sie durch ein gewöhnliches Value Object.


Geschichte

In einem Projekt mit Mikrodiensten verwendeten sie value classes als IDs in der API. Einer der Dienste gab eine Zeichenfolge direkt zurück, ein anderer — eine value class, was zu einem Serialisierungs Konflikt mit Jackson führte. Dies wurde durch explizite Zuordnung zwischen ID und Zeichenfolge behoben.