object em Kotlin: sintaxe e uso prático de objetos singleton

Autor: IT Sectr Publicado: 2026-06-21 Tempo de leitura: 9 min

object em Kotlin é uma forma declarativa de criar um objeto singleton com inicialização lazy e segurança de thread por padrão. A palavra-chave object substitui uma classe inteira por uma única instância e é usada para declarar singletons, companion objects, objetos anônimos e utilitários estáticos. De acordo com a documentação JetBrains Kotlin (2026), object declaration é a maneira mais simples e segura de implementar um singleton no mundo JVM.

Principais pontos

  • object — palavra-chave para declarar uma classe singleton com uma única instância
  • Inicialização lazy — object é criado no primeiro acesso, não ao carregar a classe
  • Companion object — análogo de membros estáticos em Kotlin (sem static keyword)
  • Object expression — objeto anônimo para sobrescrever métodos rapidamente
  • Segurança de threads — a inicialização de object é garantidamente thread-safe

O que é object em Kotlin?

object em Kotlin é uma forma especial de declaração que simultaneamente define uma classe e cria sua única instância (singleton). É um híbrido de declaração de classe e criação de instância em uma única construção.

Em Java, criar um singleton requer um construtor privado, um campo estático, um método getInstance e tratamento de segurança de threads. Kotlin object faz isso em uma única linha de código: object MySingleton { }. O compilador gera automaticamente uma inicialização lazy thread-safe usando o mecanismo static initializer no bytecode JVM.

De acordo com a Especificação da Linguagem Kotlin (2026), object declaration é compilado em uma classe final com um construtor privado e um campo estático INSTANCE inicializado em um bloco estático. Isso garante atomicidade de inicialização no nível da JVM.

Objetos singleton (object declaration)

Object declaration (objeto singleton) é declarado usando a palavra-chave object seguida por um nome. O corpo do objeto pode conter propriedades, métodos, blocos init e herdar outras classes ou interfaces.

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

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

A inicialização do DatabaseManager ocorre no primeiro acesso — de forma lazy e thread-safe. Nenhum código de sincronização adicional é necessário.

Herança para object

Object pode herdar classes e interfaces regulares. Isso permite usar object como implementação de uma classe abstrata ou interface com uma única instância.

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

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

Companion object

companion object é um objeto especial declarado dentro de uma classe com a palavra-chave companion. Ele substitui membros estáticos em Kotlin, já que a linguagem não possui a palavra-chave static.

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

// Chamando sem criar uma instância de ApiClient
val client = ApiClient.create()

Companion object pode ter um nome (padrão é Companion), implementar interfaces e ser estendido via extension functions. Diferente de métodos estáticos em Java, um companion object é um objeto completo que pode ser passado como argumento ou armazenado em uma variável.

De acordo com as Melhores Práticas Kotlin (2026), companion object é usado para métodos fábrica, constantes e utilitários estáticos relacionados à classe. Recomenda-se evitar o uso excessivo de companion object — para utilitários não relacionados, funções de nível superior são preferíveis.

Anotação @JvmStatic

Para compatibilidade com Java, métodos do companion object podem ser anotados com @JvmStatic. Isso gera um método estático real no bytecode JVM, acessível de código Java sem a sintaxe Companion.

Object expressions (objetos anônimos)

Object expression é um objeto anônimo criado no momento para sobrescrever métodos de uma classe ou interface sem declarar uma classe nomeada separada.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Tarefa executada")
    }
}

thread(handler)

Object expressions diferem das declarações object porque criam uma nova instância a cada execução. Eles não são singletons e não têm nome. Objetos anônimos podem capturar variáveis de seu fechamento, assim como lambdas.

Ao contrário de Java, onde classes anônimas podem herdar apenas um tipo, a object expression do Kotlin pode herdar múltiplos tipos ao mesmo tempo.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Renderizando botão")
    override fun click() = println("Botão clicado")
}

Casos práticos de uso

Object é uma das construções mais versáteis do Kotlin, usada em muitos cenários.

Singleton de Repository

Em projetos Android, object é frequentemente usado para declarar um Repository onde múltiplas instâncias não são necessárias. Uma única instância garante consistência dos dados.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // obtendo o usuário
        return null
    }
}

Métodos fábrica via companion object

Companion object com métodos fábrica é uma alternativa a múltiplos construtores. Métodos fábrica nomeados tornam o código autodocumentado.

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

Constantes e enumerações

Object pode servir como contêiner de constantes, substituindo campos static final em Java. Object suporta herança, o que permite criar hierarquias de configuração.

De acordo com a Biblioteca Padrão Kotlin (2026), object declaration é a maneira mais eficiente de criar um singleton em Kotlin, superando implementações double-checked locking e comparável ao singleton enum em Java.

Perguntas frequentes

Como object difere de uma classe normal?

Object simultaneamente declara uma classe e cria sua única instância. Uma classe normal pode ter múltiplas instâncias criadas via construtor.

Quando um object declaration é inicializado?

Lazy — no primeiro acesso ao objeto. Até lá, nenhuma memória é alocada e o código no bloco init não é executado.

Um object pode ter um construtor?

Não, object não pode ter um construtor explícito. A inicialização é realizada no bloco init, que é chamado uma vez no primeiro acesso ao objeto.

Como companion object difere de um object normal?

companion object é um object declarado dentro de uma classe. Seus membros são acessíveis através do nome da classe sem criar uma instância, substituindo membros estáticos de Java.

Object declarations são seguros em ambiente multithread?

Sim, a inicialização de object é completamente thread-safe graças ao inicializador estático da JVM. Nenhuma sincronização adicional é necessária.

Resumo

  • object — singleton declarativo com inicialização lazy e thread-safe
  • companion object — membros estáticos em Kotlin, métodos fábrica, constantes
  • Object expression — objetos anônimos no momento com captura de variáveis do fechamento
  • Herança — object pode herdar classes e interfaces, incluindo múltiplos tipos
  • Desempenho — inicialização via static initializer da JVM, sem overhead de double-checked locking
  • Uso — serviços singleton, repository, constantes, fábricas, adaptadores de listener
  • Limitações — sem construtor explícito, uma única instância por JVM

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também