Introdução
Continuando aprendizado e descoberta sobre Kotlin. Falaremos sobre outros tipos de classes.
Recursos da linguagens observadores e experimentados
Nessa seção, pretendo falar de alguns recursos que pude experimentar durante o curso, e pratiquei em um projeto piloto que está disponível em um repositório no meu github onde pretendo colocar os demos do que ando testando com Kotlin. Esse repositório é o kotlin-lab.
Enum Classes
Enums seguem mesma estrutura conhecida do mundo Java. Cada constante de uma enum é um objeto. O Enum pode ser inicializado no construtor como no exemplo abaixo.
Um recurso interessante do Kotlin é que uma Enum pode implementar uma interface (porém não pode herdar de uma classe). Para isso, é necessário ela fornecer uma implementação do método da interface para cada entrada da enum.
Por default, enum em Kotlin oferece possibilidade de obter pelo nome e a lista de enum através de métodos da própria API nativa da linguagem. Caso uma busca por nome, seja de alguma constante não defiinda na Enum, um erro IllegalArgumentException é levantado.
As enums em Kotlin oferece acesso a duas propriedades, o nome e a posição dela dentro da declaração da Enum.
Enums, implementam Comparable e a ordem natural padrão é a ordem na qual ela foi declarada na classe que criou a enum.
Sealed CLasses
Esse tipo de classes são utilizadas para representar restrições para hierarquia de heranças. Quando um valor pode ter um dos tipos limitados de um subtipo, mas não pode ter qualquer tipo dentro da herança. É como se fosse um Enum para classes, uma vez que o domínio é restrito. A diferença básica é que Enum são singletons (só possui uma instância).
Uma classe selada pode ter subclasses mas todas elas precisam ser declaradas no mesmo arquivo da classe em questão. Exemplo:
Esse tipo de classe é abstrato e não pode ser instanciado diretamente. Pode ter membros abstractos. Por serem abstratos não podem ter construtores não privados. Construtores são privados por padrão.
Esse texto de Joel Amálio, descreve com outros exemplos, o uso de Sealed classes em Kotlin.
Nested Classes
Classes que são aninhadas em outras classes.
Inner classes
São nested classes que podem acessar membros da classe externa. Kotlin define uma referência para um objeto da classe externa.
Anonymous Inner classes
Inner classes criadas usango uma expressão de objeto.
Na JVM se um objeto é instancia de uma interface funcional do Java (interface com apenas um método abstrato), é possível criar usando uma expressão lambada um objeto pelo tipo da interface.
Inline Classes
Recurso disponível na linguagem, a partir da versão 1.3 e atualmente para fazer uso, é necessário habilitar uma parametrização conforme esse link. Confesso que não vi muita aplicabilidade para esse recurso, porém como é algo que existe, trouxe para mencionar. Mais detalhe pode ser entendido na documentação.
Conclusão
Até o momento, me parece que Kotlin resolve muitos problemas de design do Java e vem como uma opção muito moderna para quem trabalha usando a JVM. Até o momento, o aprendizado tem sido bastante produtivo.
Outras Fontes:
- https://kotlinlang.org/docs/tutorials/kotlin-for-py/classes.html
- https://kotlinlang.org/docs/reference/enum-classes.html
- https://kotlinlang.org/docs/reference/sealed-classes.html
- https://kotlinlang.org/docs/reference/nested-classes.html
- https://kotlinlang.org/docs/reference/inline-classes.html
- https://kotlinlang.org/docs/reference/inline-classes.html#experimental-status-of-inline-classes