Kotlin: O Futuro do Android e Além
Domine Kotlin para desenvolvimento Android, backend e multiplataforma
Kotlin: O Futuro do Android e Além
Kotlin é uma linguagem de programação moderna desenvolvida pela JetBrains. Desde 2017, é a linguagem oficial recomendada pelo Google para desenvolvimento Android. Com sua sintaxe concisa, null safety nativo e interoperabilidade total com Java, Kotlin conquistou desenvolvedores ao redor do mundo.
Por que Kotlin? Kotlin reduz significativamente o código boilerplate, elimina NullPointerExceptions e oferece features modernas que aumentam a produtividade sem sacrificar a performance.
Características Distintivas
- Null Safety - Sistema de tipos que elimina NPEs
- Data Classes - Classes de dados sem boilerplate
- Extension Functions - Adicione funções a classes existentes
- Coroutines - Concorrência leve e eficiente
- Smart Casts - Casts automáticos após verificação
- Kotlin Multiplatform - Código compartilhado entre plataformas
Fundamentos
Tipos e Variáveis
// val (imutável) vs var (mutável)
val nome: String = "Maria" // Não pode ser reatribuído
var idade: Int = 25 // Pode ser reatribuído
val altura = 1.68 // Inferência de tipo (Double)
// Nullable types
var email: String? = null // Pode ser null
val emailNaoNull: String = "[email protected]" // Não pode ser null
// Safe call operator
val tamanho: Int? = email?.length
// Elvis operator
val tamanhoOuZero: Int = email?.length ?: 0
// Not-null assertion (use com cuidado!)
val tamanhoForce: Int = email!!.length
// Collections
val frutas = listOf("maçã", "banana", "laranja") // Imutável
val frutasMutaveis = mutableListOf("maçã", "banana")
frutasMutaveis.add("laranja")
val usuarios = mapOf("alice" to 25, "bob" to 30)
val usuariosMutaveis = mutableMapOf<String, Int>()
// Destructuring
val (primeiro, segundo) = listOf("a", "b")
val (chave, valor) = usuarios.entries.first()
Funções
// Função básica
fun saudar(nome: String): String {
return "Olá, $nome!"
}
// Single-expression function
fun saudarCurto(nome: String) = "Olá, $nome!"
// Parâmetros com valor padrão
fun criarUsuario(
nome: String,
email: String,
ativo: Boolean = true,
idade: Int? = null
): Usuario = Usuario(nome, email, ativo, idade)
// Named arguments
val usuario = criarUsuario(
nome = "Maria",
email = "[email protected]",
idade = 25
)
// Extension functions
fun String.capitalizar(): String =
this.lowercase().replaceFirstChar { it.uppercase() }
val texto = "HELLO WORLD".capitalizar() // "Hello world"
// Higher-order functions
fun <T> List<T>.filtrarE(
predicado1: (T) -> Boolean,
predicado2: (T) -> Boolean
): List<T> = this.filter { predicado1(it) && predicado2(it) }
// Inline functions (evita overhead de lambdas)
inline fun <T> measureTime(block: () -> T): Pair<T, Long> {
val start = System.currentTimeMillis()
val result = block()
val time = System.currentTimeMillis() - start
return result to time
}
Classes e Objetos
// Data class - gera equals, hashCode, toString, copy
data class Usuario(
val id: Long,
val nome: String,
val email: String,
val ativo: Boolean = true
)
// Uso de copy
val usuario1 = Usuario(1, "Maria", "[email protected]")
val usuario2 = usuario1.copy(nome = "Maria Silva")
// Classe com propriedades customizadas
class Retangulo(val largura: Double, val altura: Double) {
val area: Double
get() = largura * altura
val perimetro: Double
get() = 2 * (largura + altura)
operator fun contains(ponto: Ponto) =
ponto.x in 0.0..largura && ponto.y in 0.0..altura
}
// Sealed class (hierarquia restrita)
sealed class Resultado<out T> {
data class Sucesso<T>(val dados: T) : Resultado<T>()
data class Erro(val mensagem: String, val codigo: Int) : Resultado<Nothing>()
data object Carregando : Resultado<Nothing>()
}
// Object (singleton)
object GerenciadorConfig {
var tema: String = "escuro"
var idioma: String = "pt-BR"
fun reset() {
tema = "escuro"
idioma = "pt-BR"
}
}
// Companion object (membros estáticos)
class Usuario private constructor(val id: Long, val nome: String) {
companion object {
private var proximoId = 0L
fun criar(nome: String): Usuario {
return Usuario(++proximoId, nome)
}
}
}
Coroutines
import kotlinx.coroutines.*
// Função suspend
suspend fun buscarUsuario(id: Long): Usuario {
delay(1000) // Simula operação assíncrona
return Usuario(id, "Maria", "[email protected]")
}
// Lançando coroutines
fun main() = runBlocking {
// launch - fire and forget
launch {
val usuario = buscarUsuario(1)
println(usuario)
}
// async - retorna resultado
val deferred = async {
buscarUsuario(2)
}
val usuario = deferred.await()
// Múltiplas operações em paralelo
val (user1, user2, user3) = awaitAll(
async { buscarUsuario(1) },
async { buscarUsuario(2) },
async { buscarUsuario(3) }
)
}
// Context e dispatchers
suspend fun processarDados() = withContext(Dispatchers.Default) {
// CPU-intensive work
}
suspend fun buscarDaRede() = withContext(Dispatchers.IO) {
// Network/disk operations
}
// Flow (streams reativos)
fun obterNumeros(): Flow<Int> = flow {
for (i in 1..10) {
delay(100)
emit(i)
}
}
// Coletando flow
suspend fun coletarNumeros() {
obterNumeros()
.filter { it % 2 == 0 }
.map { it * 2 }
.collect { println(it) }
}
Jetpack Compose
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun ListaUsuarios(
usuarios: List<Usuario>,
onUsuarioClick: (Usuario) -> Unit
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(usuarios) { usuario ->
CartaoUsuario(
usuario = usuario,
onClick = { onUsuarioClick(usuario) }
)
}
}
}
@Composable
fun CartaoUsuario(
usuario: Usuario,
onClick: () -> Unit
) {
Card(
modifier = Modifier.fillMaxWidth(),
onClick = onClick
) {
Column(
modifier = Modifier.padding(16.dp)
) {
Text(
text = usuario.nome,
style = MaterialTheme.typography.headlineSmall
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = usuario.email,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
}
// ViewModel com StateFlow
class UsuariosViewModel : ViewModel() {
private val _usuarios = MutableStateFlow<List<Usuario>>(emptyList())
val usuarios: StateFlow<List<Usuario>> = _usuarios.asStateFlow()
private val _carregando = MutableStateFlow(false)
val carregando: StateFlow<Boolean> = _carregando.asStateFlow()
fun carregarUsuarios() {
viewModelScope.launch {
_carregando.value = true
try {
_usuarios.value = repositorio.buscarTodos()
} finally {
_carregando.value = false
}
}
}
}
Ferramentas Essenciais
| Ferramenta | Propósito |
|---|---|
| Android Studio | IDE oficial para Android |
| IntelliJ IDEA | IDE da JetBrains |
| Gradle | Sistema de build |
| Ktor | Framework para backend |
Checklist de Aprendizado
- Dominar null safety e tipos
- Entender data classes e sealed classes
- Aprender coroutines e Flow
- Estudar Jetpack Compose
- Praticar com um app Android
- Explorar Kotlin Multiplatform
- Publicar um app na Play Store
Recursos Essenciais
Citação
“Kotlin é uma linguagem pragmática projetada para desenvolvedores que valorizam produtividade.” - Andrey Breslav
Kotlin é o presente e o futuro do desenvolvimento Android. Comece agora e transforme sua forma de desenvolver apps!