Escolar Documentos
Profissional Documentos
Cultura Documentos
prefácio
Embora Kotlin tenha surgido em 2011, é uma das linguagens mais novas do ecos-
sistema Java. Desde então, uma versão do Kotlin rodando na máquina virtual Ja-
vaScript foi lançada, bem como uma versão compilada para código nativo. Isso
torna Kotlin uma linguagem muito mais universal do que Java, embora existam
grandes diferenças entre essas versões porque a versão Java depende da biblio-
teca padrão Java, que não está disponível nas outras duas. JetBrains, o criador ou
Kotlin, está trabalhando duro para levar cada versão a um nível equivalente, mas
isso levará algum tempo.
A versão JVM (Java Virtual Machine) é de longe a versão mais utilizada, e isso teve
um grande impulso quando o Google decidiu adotar o Kotlin como linguagem ofi-
cial para o desenvolvimento de aplicativos Android. Uma das principais razões
para a adoção do Google foi que a versão do Java disponível no Android é o Java
6, enquanto o Kotlin oferece a maioria dos recursos do Java 11 e muito mais. O Ko-
tlin também foi adotado pelo Gradle como a linguagem oficial para escrever
scripts de build para substituir o Groovy, que permite usar a mesma linguagem
para o build e para o que é construído.
Cada língua tem seu próprio jeito, determinado por alguns conceitos fundamen-
tais. Java foi criado com vários conceitos fortes em mente. Ele deve ser executado
em qualquer lugar, ou seja, em qualquer ambiente para o qual uma JVM esteja
disponível. A promessa era: “Escreva uma vez, execute em qualquer lugar”. Em-
bora alguns possam argumentar o contrário, essa promessa foi cumprida. Você
não apenas pode executar programas Java em quase todos os lugares, mas tam-
bém pode executar programas escritos em outras linguagens e compilados para a
JVM. Kotlin é uma dessas linguagens.
Outra das promessas de Java era que nenhuma evolução quebraria o código exis-
tente. Embora isso nem sempre tenha sido verdade, na maioria das vezes tem
sido respeitado. Mas isso pode não ser uma coisa boa. A principal consequência é
que muitas melhorias em outras linguagens não puderam ser trazidas para o Java
porque essas melhorias teriam destruído a compatibilidade. Qualquer programa
compilado com uma versão anterior do Java deve poder ser executado nas ver-
sões mais recentes sem ser recompilado. Se isso é útil ou não é uma questão de
opinião, mas o resultado é que a compatibilidade com versões anteriores sempre
jogou contra a evolução do Java.
Java também deveria tornar os programas mais seguros usando exceções verifica-
das, forçando assim os programadores a levar essas exceções em consideração.
Para muitos programadores, isso provou ser um fardo, levando à prática de agru-
par constantemente exceções verificadas em exceções não verificadas.
Embora Java seja uma linguagem orientada a objetos, ela deve ser tão rápida
quanto a maioria das linguagens para processamento de números. Os projetistas
da linguagem decidiram que, além dos objetos que representam números e valo-
res booleanos, Java se beneficiaria de ter primitivos não-objetos correspondentes,
permitindo cálculos muito mais rápidos. A consequência era que você não podia
(e ainda não pode) colocar primitivos em coleções como listas, conjuntos ou ma-
pas. E quando os fluxos foram adicionados, os projetistas de linguagem decidiram
criar versões específicas para primitivos — mas não todos os primitivos, apenas
os mais comumente usados. Se você estiver usando algumas das primitivas não
suportadas, você está sem sorte.
Java foi projetado há mais de 20 anos. Muitas coisas mudaram desde aquela
época, mas a maioria dessas mudanças não pôde ser trazida para o Java. Isso por-
que teria quebrado a compatibilidade ou eles foram trazidos para o Java de forma
que a compatibilidade fosse preservada em detrimento da usabilidade.
Muitas novas linguagens, como Groovy, Scala e Clojure, foram lançadas desde en-
tão para lidar com essas limitações. Essas linguagens são compatíveis com Java
até certo ponto, o que significa que você pode usar bibliotecas Java existentes em
projetos escritos nessas linguagens, e os programadores Java podem usar bibliote-
cas desenvolvidas nessas linguagens.
Kotlin é diferente. O Kotlin é muito mais integrado ao Java, a ponto de você poder
misturar código-fonte Kotlin e Java no mesmo projeto sem nenhuma dificuldade!
Ao contrário de outras linguagens JVM, Kotlin não parece uma linguagem dife-
rente (embora seja um pouco diferente). Em vez disso, parece o que o Java deve-
ria ter se tornado. Alguns até dizem que Kotlin é o Java feito certo, o que significa
que ele corrige a maioria dos problemas com a linguagem Java. (No entanto, o Ko-
tlin ainda precisa lidar com as limitações da JVM.)
Porém, mais importante, o Kotlin foi projetado para ser muito mais amigável com
muitas técnicas provenientes da programação funcional. Kotlin tem referências
mutáveis e imutáveis, mas promove fortemente as imutáveis. Kotlin também pos-
sui grande parte das abstrações funcionais que permitem evitar estruturas de
controle (embora também possua estruturas de controle tradicionais para suavi-
zar a transição das linguagens tradicionais).
Outro grande benefício de usar o Kotlin é que ele reduz a necessidade de código
clichê, permitindo o mínimo necessário. Com Kotlin, você pode criar uma classe
com propriedades opcionais (mais equals , hashCode , toString e copy fun-
ções) em uma única linha de código, onde a mesma classe escrita em Java precisa-
ria de cerca de trinta linhas (incluindo getters, setters e construtores
sobrecarregados).
Embora existam outras linguagens que foram projetadas para superar as limita-
ções do Java no ambiente JVM, o Kotlin é diferente porque se integra aos progra-
mas Java no nível do código-fonte do projeto. Você pode misturar arquivos de ori-
gem Java e Kotlin nos mesmos projetos com uma única cadeia de construção. Isso
é uma virada de jogo, especialmente em relação à programação de equipe, onde
usar Kotlin em um ambiente Java não é mais complicado do que usar qualquer bi-
blioteca de terceiros. Isso torna a transição mais suave possível de Java para uma
nova linguagem e permite que você escreva programas que sejam:
Mais seguro
Mais fácil de escrever, testar e manter
Mais escalável
Suspeito que muitos leitores serão programadores Java em busca de novas solu-
ções para seus problemas do dia a dia. Se este é você, deve estar se perguntando
por que deveria usar Kotlin. Já não existem outras linguagens no ecossistema Java
com as quais você pode aplicar facilmente técnicas de programação seguras?
Claro que existem, e um dos mais conhecidos é o Scala. Scala é uma alternativa
muito boa para Java, mas Kotlin tem algo mais. Scala pode interagir com Java no
nível da biblioteca, o que significa que programas Java podem usar bibliotecas
Scala (objetos e funções) e bibliotecas Scala podem usar bibliotecas Java (objetos e
métodos). Mas os programas Scala e Java devem ser construídos como projetos se-
parados, ou pelo menos módulos separados, enquanto as classes Kotlin e Java po-
dem ser misturadas dentro do mesmo módulo.
Gostaria de agradecer às muitas pessoas que participaram para tornar este livro
possível. Em primeiro lugar, um grande obrigado à minha editora de desenvolvi-
mento, Marina Michaels. Além do seu maravilhoso trabalho no manuscrito, foi
um grande prazer trabalhar com você. Agradeço também ao meu editor de rese-
nhas, Aleksandar Dragosavljević.
Este livro ensina técnicas que foram desenvolvidas há muito tempo em muitos
ambientes diferentes, embora muitas delas venham da programação funcional.
Mas este livro não é sobre programação funcional fundamentalista. Este livro é
sobre programação segura pragmática.
Este livro não é sobre aprender a programar desde o nível zero. Destina-se a pro-
gramadores em ambientes profissionais que procuram uma maneira mais fácil e
segura de escrever programas sem erros.
O que você aprenderá
Neste livro, você aprenderá técnicas específicas que podem diferir do que você
aprendeu se for um programador Java. A maioria dessas técnicas soará desconhe-
cida ou até mesmo contradirá o que os programadores geralmente reconhecem
como melhores práticas. Mas muitas (embora não todas) práticas recomendadas
são da época em que os computadores tinham 640 K de memória, 5 MB de arma-
zenamento em disco e um processador de núcleo único. As coisas mudaram. Hoje
em dia, um smartphone simples é um computador com 3 GB ou mais de RAM, 256
GB de armazenamento em disco de estado sólido e um processador de 8 núcleos;
da mesma forma, os computadores têm muitos gigabytes de memória, terabytes
de armazenamento e processadores multi-core.
Uma das técnicas mais importantes que você aprenderá é levar a abstração muito
além (embora os programadores tradicionais considerem a abstração prematura
tão ruim quanto a otimização prematura). Mas forçar a abstração ainda mais re-
sulta em uma compreensão muito melhor do problema a ser resolvido, o que, por
sua vez, resulta na resolução mais frequente do problema certo em vez de outro
diferente.
Imutabilidade
A imutabilidade é uma técnica que consiste em usar apenas dados não modificá-
veis. Muitos programadores tradicionais têm dificuldade em imaginar como é
possível escrever programas úteis usando apenas dados imutáveis. A programa-
ção não é baseada principalmente na modificação de dados? Bem, isso é como
acreditar que a contabilidade está basicamente modificando valores em um livro
contábil.
transparência referencial
Esses programas não são apenas mais seguros (porque você sempre sabe como
eles se comportarão), mas também são muito mais fáceis de compor, manter, atu-
alizar e testar. E os programas que são mais fáceis de testar são geralmente testa-
dos melhor e, portanto, são mais confiáveis.
Outro problema comum é o uso correto de while e do while (ou repeat un-
til ) e, particularmente, determinar onde testar a condição. Um problema adicio-
nal é a modificação simultânea durante o loop em coleções, onde você encontra o
problema de compartilhar o estado mutável embora esteja usando um único th-
read! A abstração das estruturas de controle permite eliminar completamente es-
ses tipos de problemas.
Na programação tradicional, tipos gerais como int e String são usados para re-
presentar quantidades sem levar em consideração as unidades. Como consequên-
cia, é muito fácil mexer com esses tipos, somando milhas a galões ou dólares a mi-
nutos. O uso de tipos de valor pode eliminar completamente esse tipo de pro-
blema a um custo muito baixo, mesmo que a linguagem que você está usando não
ofereça tipos de valor verdadeiros.
Preguiça
A maioria das linguagens comuns são consideradas restritas , o que significa que
os argumentos passados para um método ou função são avaliados primeiro antes
de serem processados. Isso parece fazer sentido, embora muitas vezes não. Pelo
contrário, a preguiça é uma técnica que consiste em avaliar elementos apenas se e
quando eles forem usados. A programação é essencialmente baseada na preguiça.
Público
Este livro deve ser lido sequencialmente, pois cada capítulo se baseia nos concei-
tos aprendidos nos anteriores. Eu uso a palavra ler , mas este livro não se destina
apenas a ser lido. Muito poucas seções contêm apenas teoria.
Para obter o máximo deste livro, leia-o em seu computador, resolvendo cada exer-
cício à medida que avança. Cada capítulo inclui uma série de exercícios com as
instruções e dicas necessárias para ajudá-lo a chegar à solução. Cada exercício
vem com uma solução proposta e um teste que você pode usar para verificar se
sua solução está correta.
Completando os exercícios
Essa abordagem não requer muita digitação tediosa porque você não tem quase
nada para copiar. A maioria dos exercícios consiste em escrever implementações
para funções, para as quais você recebe o ambiente e a assinatura da função. Ne-
nhuma solução de exercício tem mais de uma dúzia de linhas de código; a maioria
tem cerca de quatro ou cinco linhas. Depois de terminar um exercício (ou seja,
quando sua implementação for compilada), basta executar o teste correspondente
para verificar se está correto.
As técnicas descritas neste livro não são mais difíceis de dominar do que as tradi-
cionais. Eles são apenas diferentes. Você pode resolver os mesmos problemas com
técnicas tradicionais, mas traduzir de uma técnica para outra pode ser ineficiente.
Aprender novas técnicas é como aprender uma língua estrangeira. Assim como
você não pode pensar eficientemente em um idioma e traduzir para outro, você
não pode pensar na programação tradicional baseada em mutação de estado e
fluxo de controle e traduzir seu código para funções que lidam com dados imutá-
veis. E, assim como você precisa aprender a pensar em um novo idioma, precisa
aprender a pensar de maneira diferente. Isso não vem apenas com a leitura; ele
vem com código de escrita. Então você tem que praticar!
É por isso que não espero que você entenda o que está neste livro apenas lendo-o,
e porque ofereço tantos exercícios; você deve fazer os exercícios para compreen-
der completamente os conceitos. Não porque cada tópico seja tão complexo que
não seja possível compreendê-lo apenas pela leitura. Se você pudesse entendê-lo
apenas lendo sem fazer os exercícios, provavelmente não precisaria deste livro.
Por todos esses motivos, os exercícios são essenciais para aproveitar ao máximo
este livro. Encorajo-o a tentar resolver cada exercício antes de continuar a leitura.
Se você não encontrar uma solução, tente novamente em vez de ir diretamente
para a solução que forneço.
Você pode baixar o código como um arquivo ou cloná-lo usando o Git. O código
dos exercícios é organizado em módulos com nomes que refletem os títulos dos
capítulos em vez dos números dos capítulos. Como resultado, o IntelliJ os classifi-
cará em ordem alfabética, e não na ordem em que aparecem no livro.
Para ajudá-lo a descobrir qual módulo corresponde a cada capítulo, forneci uma
lista dos capítulos com os nomes dos módulos correspondentes no arquivo RE-
ADME que acompanha o código ( http://github.com/pysaumont/fpinkotlin ).
O código-fonte de todas as listas neste livro também está disponível para down-
load no site da Manning em https://www.manning.com/books/the-joy-of-kotlin .
discussão ao vivo
A compra de The Joy of Kotlin inclui acesso gratuito a um fórum privado da Web
administrado pela Manning Publications, onde você pode fazer comentários sobre
o livro, fazer perguntas técnicas e receber ajuda do autor e de outros usuários.
Para acessar o fórum, acesse https://livebook.manning.com/#!/book/the-joy-of-
kotlin/discussion . Você também pode saber mais sobre os fóruns de Manning e as
regras de conduta em https://livebook.manning.com/#!/discussion .
Sobre o autor
A figura na capa de The Joy of Kotlin tem a legenda “Habit of a Lady in Chinese
Tartary, 1700”. A ilustração foi tirada de A Collection of the Dresses of Different Na-
tions, Ancient and Modern (quatro volumes), de Thomas Jefferys, Londres, publi-
cada entre 1757 e 1772. A página de título afirma que são gravuras em placa de
cobre coloridas à mão, realçadas com goma arábica .
Thomas Jefferys (1719–1771) foi chamado de “geógrafo do rei George III”. Ele era
um cartógrafo inglês que era o principal fornecedor de mapas de sua época. Ele
gravou e imprimiu mapas para o governo e outros órgãos oficiais e produziu uma
ampla gama de mapas e atlas comerciais, especialmente da América do Norte. Seu
trabalho como cartógrafo despertou o interesse pelos costumes locais de vestuário
das terras que ele pesquisou e mapeou, que são exibidos de forma brilhante nesta
coleção. O fascínio por terras distantes e as viagens de lazer eram fenômenos rela-
tivamente novos no final do século XVIII, e coleções como esta eram populares,
apresentando tanto o turista quanto o viajante de poltrona aos habitantes de ou-
tros países.