ProgrammazioneSviluppatore Backend

Che cos'è una 'inline class' (value class) in Kotlin? A cosa servono, come usarle correttamente, quali limitazioni e caratteristiche hanno queste classi? Fai un esempio di codice.

Supera i colloqui con l'assistente IA Hintsage

Risposta

L'inline class (a partire da Kotlin 1.5 — value class) consente di creare wrapper attorno ai primitivi senza creare un oggetto separato durante l'esecuzione. Questo è utilizzato per aumentare la type-safety senza costi di allocazione della memoria. Sotto il cofano, questi oggetti possono essere compilati nel corrispondente primitivo.

Esempio:

@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
  • È consentita solo una proprietà (campo principale).
  • Un costruttore senza argomenti non è possibile.
  • La classe non può contenere stato (ad esempio, variabili), solo val.
  • Non può ereditare da altre classi, ma può implementare interfacce.
  • L'interazione con il codice Java può non essere ovvia — possibile boxing/unboxing.

L'uso di classi inline/value è importante per la tipizzazione di identificatori, denaro, unità di misura, ecc.

Domanda trabocchetto

Può una value class avere più di una proprietà?

Risposta: No. La value class può contenere solo una proprietà nel costruttore principale.

Esempio di codice errato:

@JvmInline value class Money(val amount: Int, val currency: String) // Errore di compilazione

Esempi di errori reali dovuti all'ignoranza delle sfumature dell'argomento


Storia

In una兑换货币 utilizzavano la classe inline per descrivere importi e valuta. Hanno provato ad aggiungere due campi alla value class, ricevuto un errore di compilazione e speso del tempo a cercare di aggirare la limitazione. Alla fine hanno deciso di fare una data class separata.


Storia

Durante l'integrazione con una libreria Java esterna, la classe inline veniva a volte convertita in oggetto (boxing) in modo imprevisto, influenzando le prestazioni. Dopo aver analizzato la documentazione, l'hanno sostituita con un normale value object.


Storia

In un progetto con microservizi utilizzavano classi value come identificativi nell'API. Uno dei servizi restituiva una stringa direttamente, l'altro — una value class, il che portava a un conflitto di serializzazione con Jackson. Hanno risolto tramite mappatura esplicita tra ID e stringa.