Introdução: Por que essa pergunta atormenta todos que migram de Java para Kotlin
Você acabou de começar a estudar Kotlin depois de Java e já se deparou com a primeira surpresa? Você tenta declarar um array de strings como estava acostumado em Java — String[] names = {"Alice", "Bob"} — e o compilador Kotlin dá erro? Parabéns, você não está sozinho. A pergunta "What's the Kotlin equivalent of Java's String[]?" acumulou milhares de visualizações no Stack Overflow, e não é por acaso.
Kotlin não é apenas "Java com açúcar". O Google o posiciona como uma linguagem mais moderna, segura e concisa. Mas essa concisão às vezes confunde iniciantes. Em Java, um array é uma construção nativa da linguagem. Em Kotlin, os arrays fazem parte da biblioteca padrão e têm suas próprias peculiaridades.
Neste artigo, vamos abordar tudo o que você precisa saber sobre arrays de strings em Kotlin. Você aprenderá não apenas o análogo direto de String[], mas também alternativas mais flexíveis que tornarão seu código mais limpo e seguro. Vamos lá!
1. Análogo direto: Array<String>
A maneira mais simples e óbvia de substituir String[] em Kotlin é usar Array<String>. Em Kotlin, todos os arrays são objetos da classe Array<T>, onde T é o tipo dos elementos.
Como declarar e inicializar?
Em Java, você escreve:
String[] names = new String[3];names[0] = "Alice";names[1] = "Bob";names[2] = "Charlie";Em Kotlin, fica assim:
val names: Array<String> = arrayOfNulls(3)names[0] = "Alice"names[1] = "Bob"names[2] = "Charlie"Mas existe uma maneira muito mais curta — usar a função arrayOf():
val names = arrayOf("Alice", "Bob", "Charlie")O compilador Kotlin infere automaticamente o tipo Array<String>. Observe: ao contrário de Java, em Kotlin não há operador new para criar arrays. Em vez disso, são usadas funções factory.
Diferença importante: tamanho fixo
Assim como em Java, o tamanho de Array<String> é fixo. Você não pode adicionar um novo elemento após a criação. Se tentar acessar um índice fora do limite, receberá ArrayIndexOutOfBoundsException.
val fruits = arrayOf("Apple", "Banana")// fruits[2] = "Cherry" // Erro! Índice fora dos limites2. Arrays especializados: nem sempre Array<String>
Para tipos primitivos (Int, Double, Boolean), Kotlin oferece classes otimizadas: IntArray, DoubleArray, BooleanArray, etc. Elas não usam autoboxing/unboxing, economizando memória e acelerando a execução.
Mas para strings não há essa otimização, porque String é um tipo de referência, não um primitivo. Portanto, Array<String> é a única opção se você precisar exatamente de um array.
3. Alternativa nº1: List<String> (lista imutável)
Na maioria dos casos, você não precisa de um array. Em Kotlin, é fortemente recomendado usar listas em vez de arrays, a menos que você esteja trabalhando com código de baixo nível (por exemplo, JNI ou otimização de desempenho em nível de nanossegundos).
A lista List<String> é uma coleção imutável. Você não pode alterar seu tamanho ou elementos após a criação. Isso torna o código mais seguro em ambientes multithread.
val namesList: List<String> = listOf("Alice", "Bob", "Charlie")// namesList[0] = "Eve" // Erro! listOf retorna uma lista imutávelNa prática, listOf é o equivalente Kotlin de Java String[] com proteção adicional. Em Java, um array pode ser acidentalmente modificado ao ser passado para outro método. Em Kotlin, List não permite isso.