object i Kotlin: vad det är, syntax och tillämpning av singleton-objekt

Författare: IT Sectr Publicerad: 2026-06-21 Lästid: 9 min

object i Kotlin — är ett deklarativt sätt att skapa ett singleton-objekt med lat initialisering och trådsäkerhet som standard. Nyckelordet object ersätter en hel klass med en enda instans och används för att deklarera singleton, companion object, anonyma objekt och statiska verktyg. Enligt JetBrains Kotlin Documentation (2026) är object declaration det enklaste och säkraste sättet att implementera en singleton i JVM-världen.

Huvudpunkter

  • object — nyckelord för att deklarera en singleton-klass med en enda instans
  • Lat initialisering — object skapas vid första åtkomst, inte vid klassladdning
  • Companion object — motsvarighet till statiska medlemmar i Kotlin (inget static keyword)
  • Object expression — anonymt objekt för att åsidosätta metoder i farten
  • Trådsäkerhet — initialisering av object är garanterat trådsäker

Vad är object i Kotlin?

object i Kotlin — är en speciell deklarationsform som samtidigt definierar en klass och skapar dess enda instans (singleton). Det är en hybrid av class declaration och instance creation i en konstruktion.

I Java krävs för att skapa en singleton en privat konstruktor, ett statiskt fält, en getInstance-metod och hantering av trådsäkerhet. Kotlin object gör detta med en kodrad: object MySingleton { }. Kompilatorn genererar automatiskt trådsäker lat initialisering med hjälp av mekanismen static initializer i JVM-bytecode.

Enligt Kotlin Language Specification (2026) kompileras object declaration till en final klass med en privat konstruktor och ett statiskt fält INSTANCE, initierat i ett statiskt block. Detta garanterar atomicitet av initialisering på JVM-nivå.

Singleton-objekt (object declaration)

Object declaration (singleton-objekt) deklareras med nyckelordet object, följt av ett namn. Objektets kropp kan innehålla egenskaper, metoder, init-block och ärva från andra klasser eller gränssnitt.

kotlin
object DatabaseManager {
    private val connection: String = "jdbc:postgresql://localhost:5432/app"
    
    fun query(sql: String): List<Map<String, Any>> {
        // utföra frågan
        return emptyList()
    }
}

// Användning
DatabaseManager.query("SELECT * FROM users")

Initiering av DatabaseManager sker vid första åtkomst — lat och trådsäker. Ingen extra kod för synkronisering krävs.

Arv för object

Object kan ärva vanliga klasser och gränssnitt. Detta gör det möjligt att använda object som implementering av en abstrakt klass eller ett gränssnitt med en enda instans.

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

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

Companion object

companion object — är ett speciellt object deklarerat inuti en klass med nyckelordet companion. Det ersätter statiska medlemmar i Kotlin, eftersom språket inte har något static keyword.

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

// Anropa utan att skapa en ApiClient-instans
val client = ApiClient.create()

Companion object kan ha ett namn (standard Companion), implementera gränssnitt och utökas via extension functions. Till skillnad från statiska metoder i Java är companion object ett fullvärdigt objekt som kan skickas som argument eller lagras i en variabel.

Enligt Kotlin Best Practices (2026) används companion object för fabriksmetoder, konstanter och statiska verktyg kopplade till en klass. Det rekommenderas att undvika överdriven användning av companion object — för orelaterade verktyg är det bättre att använda toppnivåfunktioner.

@JvmStatic-annotering

För kompatibilitet med Java kan metoder i companion object annoteras med @JvmStatic. Detta genererar en riktig statisk metod i JVM-bytecode, tillgänglig från Java-kod utan Companion-syntax.

Object expressions (anonyma objekt)

Object expression — är ett anonymt objekt som skapas på plats för att åsidosätta metoder i en klass eller ett gränssnitt utan att deklarera en separat namngiven klass.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Uppgift utförd")
    }
}

thread(handler)

Object expressions skiljer sig från object-deklarationer genom att de skapar en ny instans vid varje exekvering. De är inte singletons och har inget namn. Anonyma objekt kan fånga variabler från en closure, precis som lambdas.

Till skillnad från Java, där anonyma klasser endast kan ärva en typ, kan Kotlin object expression ärva flera typer samtidigt.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Rendering av knapp")
    override fun click() = println("Knapp klickad")
}

Praktiska användningsscenarier

Object — en av de mest mångsidiga konstruktionerna i Kotlin, som används i många scenarier.

Singleton-repositories

I Android-projekt används object ofta för att deklarera Repository, där flera instanser inte behövs. En enda instans garanterar datakonsistens.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // hämta användaren
        return null
    }
}

Fabriksmetoder via companion object

Companion object med fabriksmetoder — ett alternativ till flera konstruktorer. Namngivna fabriksmetoder gör koden självdokumenterande.

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

Konstanter och uppräkningar

Object kan fungera som en behållare för konstanter, och ersätta statiska final-fält i Java. Object stöder arv, vilket möjliggör skapande av konfigurationshierarkier.

Enligt Kotlin Standard Library (2026) är object declaration det mest prestandaeffektiva sättet att skapa en singleton i Kotlin, snabbare än "double-checked locking"-implementeringar och jämförbart med enum singleton i Java.

Vanliga frågor

Vad skiljer object från en vanlig klass?

Object deklarerar samtidigt en klass och skapar dess enda instans. En vanlig klass kan ha flera instanser som skapas via en konstruktor.

När initieras object declaration?

Lat — vid första åtkomst till objektet. Fram till dess allokeras inget minne och koden i init-blocket körs inte.

Kan object ha en konstruktor?

Nej, object kan inte ha en explicit konstruktor. Initiering sker i init-blocket, som anropas en gång vid första åtkomst till objektet.

Vad skiljer companion object från ett vanligt object?

companion object — är ett object deklarerat inuti en klass. Dess medlemmar är tillgängliga via klassnamnet utan att skapa en instans, vilket ersätter statiska medlemmar i Java.

Är object declarations säkra i en flertrådad miljö?

Ja, initiering av object är helt trådsäker tack vare JVM:s statiska initierare. Ingen extra synkronisering krävs.

Sammanfattning

  • object — deklarativ singleton med lat och trådsäker initialisering
  • companion object — statiska medlemmar i Kotlin, fabriksmetoder, konstanter
  • Object expression — anonyma objekt på plats med infångning av variabler från closure
  • Arv — object kan ärva klasser och gränssnitt, inklusive flera typer
  • Prestanda — initiering via static initializer JVM, utan overhead för double-checked locking
  • Användning — singleton-tjänster, repositories, konstanter, fabriker, listener-adaptrar
  • Begränsningar — ingen explicit konstruktor, en instans för hela JVM

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också