Kotlin: Dois mundos em uma única linguagem
\n\nVocê já se perguntou por que alguns desenvolvedores escrevem em Kotlin como se fosse um Java melhorado, enquanto outros transformam o código em uma cascata de lambdas e encadeamentos de chamadas? A resposta é simples: Kotlin é uma linguagem multiparadigma que se dá igualmente bem com programação orientada a objetos (POO) e com programação funcional (PF).
\n\nMas como um iniciante pode não se perder nessa diversidade? E um desenvolvedor experiente, como não cair no "código espaguete" devido à mistura de estilos? Neste artigo, vamos analisar as diferenças entre essas abordagens, onde e como aplicá-las, e como Kotlin ajuda a unir seus melhores aspectos. Prepare-se: terá muito código e nada de tédio.
\n\nSe você está estudando Kotlin para desenvolvimento Android ou backend, entender esses paradigmas é seu ingresso para um mundo de código limpo, legível e sustentável. Vamos lá!
\n\nKotlin Orientado a Objetos: Clássico em um invólucro moderno
\n\nA abordagem orientada a objetos é sobre entidades. Você tem classes, as classes têm propriedades e métodos. Tudo o que o programa faz é a interação entre objetos. Kotlin pega o melhor do Java, mas adiciona açúcar: data class, object, propriedades lazy e muito mais.
Classes e herança: exemplo
\n\nImagine que estamos escrevendo um sistema para uma loja online. A abordagem POO seria assim:
\n\n// Classe base\nopen class Product(val name: String, val price: Double) {\n open fun getDescription(): String {\n return "$name custa $price reais."\n }\n}\n\n// Herança\nclass DiscountedProduct(name: String, price: Double, val discount: Double) : Product(name, price) {\n override fun getDescription(): String {\n val finalPrice = price * (1 - discount / 100)\n return "$name com desconto de $discount% custa ${"%.2f".format(finalPrice)} reais."\n }\n}\n\nfun main() {\n val apple = Product("Maçã", 50.0)\n val saleApple = DiscountedProduct("Maçã", 50.0, 20.0)\n \n println(apple.getDescription()) // Maçã custa 50.0 reais.\n println(saleApple.getDescription()) // Maçã com desconto de 20% custa 40.00 reais.\n}\n\nAqui tudo é lógico: há hierarquia, polimorfismo, encapsulamento. Mas também há desvantagens: o código se torna pesado se houver muitas classes. E se precisarmos apenas aplicar um desconto a qualquer produto — teríamos que criar subclasses.
\n\nQuando a POO domina?
\n- \n
- Modelos de negócio complexos — quando as entidades têm múltiplos estados e comportamentos. \n
- Componentes de UI — Activity, Fragment, View — tudo isso é POO clássica. \n
- Trabalho com bancos de dados — ORM (ex.: Room) usa reflexão e anotações vinculadas a classes. \n
Kotlin Funcional: Concisão e segurança
\n\nA programação funcional é sobre computação, não sobre estados. Em vez de mutação de objetos, usamos dados imutáveis e funções puras. Kotlin não obriga você a escrever no estilo funcional, mas fornece todas as ferramentas para isso: lambdas, funções de ordem superior, construções monádicas (como Result).
Funções de ordem superior: exemplo
\n\nVamos resolver o mesmo problema de descontos, mas de forma funcional:
\n\ndata class Product(val name: String, val price: Double)\n\nfun applyDiscount(discount: Double): (Product) -> Product = { product ->\n val finalPrice = product.price * (1 - discount / 100)\n product.copy(price = finalPrice)\n}\n\nfun main() {\n val apple = Product("Maçã", 50.0)\n val saleApple = applyDiscount(20.0)(apple)\n \n println("${apple.name} custa ${apple.price} reais.") // Maçã custa 50.0 reais.\n println("${saleApple.name} com desconto custa ${saleApple.price} reais.") // Maçã com desconto custa 40.0 reais.\n}\n\nObserve: não criamos uma nova classe. Apenas passamos os dados através de uma função