Oggetti in Kotlin

1. Introduzione

Kotlin ha preso in prestito molte idee da altre lingue; uno di questi costrutti è l' oggetto.

In questo rapido articolo vedremo cosa sono gli oggetti e come possono essere utilizzati.

2. Oggetti in Kotlin

In Kotlin, come in quasi tutti i linguaggi JVM, c'è il concetto di una classe come nucleo del modello di programmazione orientata agli oggetti. Kotlin introduce il concetto di oggetto in cima a quello.

Mentre una classe descrive strutture che possono essere istanziate come e quando lo si desidera e consente tutte le istanze necessarie, un oggetto rappresenta invece una singola istanza statica e non può mai avere più o meno di questa istanza.

Ciò è utile per varie tecniche, inclusi oggetti singleton e semplice impacchettamento di funzionalità per l'incapsulamento:

object SimpleSingleton { val answer = 42; fun greet(name: String) = "Hello, $name!" } assertEquals(42, SimpleSingleton.answer) assertEquals("Hello, world!", SimpleSingleton.greet("world"))

Gli oggetti offrono anche pieno supporto per i modificatori di visibilità , consentendo l'occultamento e l'incapsulamento dei dati come con qualsiasi altra classe:

object Counter { private var count: Int = 0 fun currentCount() = count fun increment() { ++count } } Counter.increment() println(Counter.currentCount()) println(Counter.count) // this will fail to compile

Inoltre, gli oggetti possono estendere le classi e implementare le interfacce . In tal modo, sono effettivamente istanze singole di classi padre, esattamente come previsto.

Questo può essere molto utile per i casi in cui abbiamo un'implementazione senza stato e non è necessario creare ogni volta una nuova istanza, ad esempio Comparator:

object ReverseStringComparator : Comparator { override fun compare(o1: String, o2: String) = o1.reversed().compareTo(o2.reversed()) } val strings = listOf("Hello", "World") val sortedStrings = strings.sortedWith(ReverseStringComparator)

3. Che cos'è un oggetto companion?

Gli oggetti companion sono essenzialmente gli stessi della definizione di un oggetto standard , solo con un paio di funzionalità aggiuntive per semplificare lo sviluppo.

Un oggetto compagno viene sempre dichiarato all'interno di un'altra classe. Sebbene possa avere un nome, non è necessario averne uno , nel qual caso ha automaticamente il nome Companion :

class OuterClass { companion object { // Equivalent to "companion object Companion" } }

Gli oggetti companion consentono l'accesso ai loro membri dall'interno della classe companion senza specificarne il nome .

Allo stesso tempo, è possibile accedere ai membri visibili dall'esterno della classe quando preceduti dal nome della classe:

class OuterClass { companion object { private val secret = "You can't see me" val public = "You can see me" } fun getSecretValue() = secret } assertEquals("You can see me", OuterClass.public) assertEquals("You can't see me", OuterClass.secret) // Cannot access 'secret'

4. Campi statici

L'utilizzo principale degli oggetti companion è sostituire i campi / metodi statici conosciuti da Java . Tuttavia, questi campi non vengono generati automaticamente come tali nel file di classe risultante.

Se abbiamo bisogno che vengano generati, dobbiamo usare invece l' annotazione @JvmStatic sul campo, che genererà il bytecode come previsto:

class StaticClass { companion object { @JvmStatic val staticField = 42 } }

Senza fare ciò, il campo statico staticField non è facilmente accessibile dal codice Java.

L'aggiunta di questa annotazione genera il campo esattamente come necessario per un campo statico standard, consentendo la piena interoperabilità da Java, se necessario .

Ciò significa che quanto sopra genera un metodo statico getStaticField () sulla classe StaticClass .

5. conclusione

Gli oggetti in Kotlin aggiungono un intero livello extra che possiamo usare, snellendo ulteriormente il nostro codice e rendendolo più facile da sviluppare.

Gli oggetti companion quindi lo portano ancora oltre, consentendo un codice più pulito che è più facile da mantenere e lavorare.

Come sempre, gli snippet di codice possono essere trovati più volte su GitHub.