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) }
Die Verwendung von inline/value Klassen ist wichtig für die Typisierung von Identifikatoren, Geld, Maßeinheiten usw.
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
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.