Java 15 – Sealed Classes and Interfaces

Photo by John-Mark Smith on Pexels.com

A novidade que tenho pra vocês me deixou realmente animado, adorei essa nova feature do Java 15, a linguagem está a ficar cada vez mais moderna e divertida!

“Sealed Classes” ou “classes seladas” é o nome da nova feature que veio através da JEP 360, e tem como fundamento definir um design limpo onde você pode restringir a estensão ou implementação de uma classe base.

Como utilizar?

Usando duas novas keywords: sealed e permits.

Exemplos? Claro!

Vamos dizer que esteja criando uma classe base e deseja que ela seja estendida por outros desenvolvedores para reutilizar o código.

Digamos que você desenvolveu uma classe base chamada Animal e deseja permitir que outro desenvolvedor crie uma classe Cat que pode estender essa classe base.

Então, você tornou a classe base Animal pública e qualquer outra classe poderia estendê-la.

E aí veio um desenvolvedor que criou uma classe Eagle e estendeu a sua classe base Animal só porque ele queria reutilizar um dos métodos da classe Animal, digamos um método chamado walk().

Mas você não quer permitir isto! O que você quer é que apenas certas subclasses estendam sua classe base Animal.

Você não pode marcar sua classe como final porque isso restringirá qualquer classe a estendê-la.

Você não pode colocar em um package privado, porque todas as classes dentro do pacote serão capazes de criar uma subclasse de Animal.

Java não permitiu tal recurso por muito tempo e esse recurso surgiu agora no Java 15!

Vamos codar!

package dev.ivanmarreta;
 
public sealed class Animal permits Cat, Dog {

   void walk();
}
package dev.ivanmarreta;
 
public final class Cat extends Animal {
 
}
package dev.ivanmarreta;
 
public final class Dog extends Animal {
 
}

Se a classe Animal permitir que apenas Cat e Dog a estendam, um erro do compilador será lançado quando uma classe Eagle tentar estendê-la.

package dev.ivanmarreta;
 
public class Eagle extends Animal {
 
}
Eagle.java:3:8 error: class is not allowed to extend sealed class: Animal

Modificadores de classe – final vs sealed

final: não pode ser estendido mais.

sealed: só pode ser estendido por suas subclasses permitidas. Dessa forma, podemos restringir ainda mais a subclasse.

non-sealed: pode ser estendido por subclasses desconhecidas.

Quando utilizar?

Não permitirá que nenhuma outra classe o estenda?

Então deve ser final.

Permitirá que apenas certas subclasses o estendam?

Então deve ser sealed.

Permitirá que qualquer número de classes o estenda?

Então deve ser non-sealed.

Mudanças também em java.lang.Class

A Reflections API também foi alterada para oferecer suporte às sealed classes.

Foram adicionados os métodos isSealed() que retorna um valor boolean e permittedSubclasses() que retorna um array do tipo ClassDesc das subclasses que são permitidas a extensão ou implementação.

Exemplo:

package dev.ivanmarreta;

public class AnimalSealedClassExample {
    public static void main(String[] args) {
        System.out.println("Animal is sealed: " + Animal.class.isSealed());
        System.out.println("Animal permittedSubclasses:");
        for (ClassDesc clazzDesc : Animal.class.permittedSubclasses()) {
            System.out.println(clazzDesc.toString());
        }
    }
}

Output:

Animal is sealed: true
Animal permittedSubclasses:
ClassDesc[Cat]
ClassDesc[Dog]

Conclusão

Java está a ficar cada vez mais dinâmico e moderno, e isso também se deve a vários recursos de linguagens JVM mais modernas, como Scala ou Kotlin.

Utilizo diariamente a JDK 11, mas estou animado pra poder usar todas as novas features das JDKs mais novas o mais breve possível. Enquanto isso a JDK 16 já anda em desenvolvimento. õ/

Espero ter animado vocês também!

Obrigado e até mais! 🙂

Leave a comment

Comments (

1

)

  1. Withney Moura (@WithneyMoura)

    Show de bola Marreta.

    Like

Create a website or blog at WordPress.com