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.