object in Kotlin: sintassi e utilizzo pratico degli oggetti singleton

Autore: IT Sectr Pubblicato: 2026-06-21 Tempo di lettura: 9 min

object in Kotlin è un modo dichiarativo per creare un oggetto singleton con inizializzazione lazy e thread safety di default. La parola chiave object sostituisce un'intera classe con una singola istanza e viene utilizzata per dichiarare singleton, companion object, oggetti anonimi e utilità statiche. Secondo la documentazione JetBrains Kotlin (2026), object declaration è il modo più semplice e sicuro per implementare un singleton nel mondo JVM.

Punti chiave

  • object — parola chiave per dichiarare una classe singleton con una singola istanza
  • Inizializzazione lazy — object viene creato al primo accesso, non al caricamento della classe
  • Companion object — analogo dei membri statici in Kotlin (nessuna parola chiave static)
  • Object expression — oggetto anonimo per sovrascrivere metodi al volo
  • Sicurezza dei thread — l'inizializzazione di object è garantita thread-safe

Cos'è object in Kotlin?

object in Kotlin è una forma di dichiarazione speciale che contemporaneamente definisce una classe e crea la sua unica istanza (singleton). È un ibrido tra dichiarazione di classe e creazione di istanza in un'unica costruzione.

In Java, creare un singleton richiede un costruttore privato, un campo statico, un metodo getInstance e la gestione della sicurezza dei thread. Kotlin object fa questo con una singola riga di codice: object MySingleton { }. Il compilatore genera automaticamente un'inizializzazione lazy thread-safe utilizzando il meccanismo static initializer nel bytecode JVM.

Secondo la Specifica del linguaggio Kotlin (2026), object declaration viene compilato in una classe finale con un costruttore privato e un campo statico INSTANCE inizializzato in un blocco statico. Questo garantisce l'atomicità dell'inizializzazione a livello JVM.

Oggetti singleton (object declaration)

Object declaration (oggetto singleton) viene dichiarato usando la parola chiave object seguita da un nome. Il corpo dell'oggetto può contenere proprietà, metodi, blocchi init ed ereditare altre classi o interfacce.

kotlin
object DatabaseManager {
    private val connection: String = "jdbc:postgresql://localhost:5432/app"
    
    fun query(sql: String): List<Map<String, Any>> {
        // esecuzione della query
        return emptyList()
    }
}

// Utilizzo
DatabaseManager.query("SELECT * FROM users")

L'inizializzazione di DatabaseManager avviene al primo accesso — in modo lazy e thread-safe. Non è richiesto alcun codice di sincronizzazione aggiuntivo.

Ereditarietà per object

Object può ereditare classi e interfacce regolari. Ciò consente di utilizzare object come implementazione di una classe astratta o interfaccia con una singola istanza.

kotlin
interface Logger {
    fun log(message: String)
}

object ConsoleLogger : Logger {
    override fun log(message: String) {
        println("[LOG] $message")
    }
}

Companion object

companion object è un object speciale dichiarato all'interno di una classe con la parola chiave companion. Sostituisce i membri statici in Kotlin poiché il linguaggio non ha la parola chiave static.

kotlin
class ApiClient {
    companion object {
        private const val BASE_URL = "https://api.example.com"
        
        fun create(): ApiClient {
            return ApiClient()
        }
    }
}

// Chiamata senza creare un'istanza di ApiClient
val client = ApiClient.create()

Companion object può avere un nome (predefinito Companion), implementare interfacce ed essere esteso tramite extension functions. A differenza dei metodi statici in Java, un companion object è un oggetto completo che può essere passato come argomento o memorizzato in una variabile.

Secondo le Buone pratiche Kotlin (2026), companion object viene utilizzato per metodi factory, costanti e utilità statiche correlate alla classe. Si consiglia di evitare un uso eccessivo di companion object — per utilità non correlate, sono preferibili funzioni di livello superiore.

Annotazione @JvmStatic

Per la compatibilità con Java, i metodi del companion object possono essere annotati con @JvmStatic. Questo genera un vero metodo statico nel bytecode JVM, accessibile dal codice Java senza la sintassi Companion.

Object expressions (oggetti anonimi)

Object expression è un oggetto anonimo creato sul momento per sovrascrivere metodi di una classe o interfaccia senza dichiarare una classe denominata separata.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Attività eseguita")
    }
}

thread(handler)

Object expressions differiscono dalle dichiarazioni object perché creano una nuova istanza ogni volta che vengono eseguite. Non sono singleton e non hanno nome. Gli oggetti anonimi possono catturare variabili dalla loro chiusura, proprio come le lambda.

A differenza di Java, dove le classi anonime possono ereditare un solo tipo, l'object expression di Kotlin può ereditare multipli tipi contemporaneamente.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Rendering del pulsante")
    override fun click() = println("Pulsante cliccato")
}

Scenari pratici di utilizzo

Object è una delle costruzioni più versatili di Kotlin, utilizzata in molti scenari.

Singleton di Repository

Nei progetti Android, object viene spesso utilizzato per dichiarare un Repository dove non sono necessarie più istanze. Un'unica istanza garantisce la coerenza dei dati.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // ottenendo l'utente
        return null
    }
}

Metodi factory tramite companion object

Companion object con metodi factory è un'alternativa a costruttori multipli. I metodi factory nominati rendono il codice auto-documentante.

kotlin
data class GsonParser {
    companion object {
        fun create(): GsonParser = GsonParser()
        fun createPretty(): GsonParser = GsonParser()
    }
}

Costanti ed enumerazioni

Object può fungere da contenitore per costanti, sostituendo i campi static final in Java. Object supporta l'ereditarietà, consentendo di creare gerarchie di configurazione.

Secondo la Libreria standard Kotlin (2026), object declaration è il modo più performante per creare un singleton in Kotlin, superando le implementazioni double-checked locking e paragonabile al singleton enum in Java.

Domande frequenti

In cosa object si differenzia da una classe normale?

Object dichiara contemporaneamente una classe e crea la sua unica istanza. Una classe normale può avere più istanze create tramite un costruttore.

Quando viene inizializzato un object declaration?

Lazy — al primo accesso all'oggetto. Fino ad allora, nessuna memoria viene allocata e il codice nel blocco init non viene eseguito.

Un object può avere un costruttore?

No, object non può avere un costruttore esplicito. L'inizializzazione viene eseguita nel blocco init, che viene chiamato una volta al primo accesso all'oggetto.

In cosa companion object si differenzia da un object normale?

companion object è un object dichiarato all'interno di una classe. I suoi membri sono accessibili tramite il nome della classe senza creare un'istanza, sostituendo i membri statici di Java.

Gli object declarations sono sicuri in un ambiente multithread?

Sì, l'inizializzazione di object è completamente thread-safe grazie all'inizializzatore statico della JVM. Non è richiesta alcuna sincronizzazione aggiuntiva.

Riepilogo

  • object — singleton dichiarativo con inizializzazione lazy e thread-safe
  • companion object — membri statici in Kotlin, metodi factory, costanti
  • Object expression — oggetti anonimi sul momento con cattura di variabili dalla chiusura
  • Ereditarietà — object può ereditare classi e interfacce, inclusi multipli tipi
  • Prestazioni — inizializzazione tramite static initializer JVM, senza overhead double-checked locking
  • Utilizzo — servizi singleton, repository, costanti, factory, adattatori listener
  • Limitazioni — nessun costruttore esplicito, una singola istanza per JVM

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche