Feature Java: Statements before super
O Java 22, a última versão da plataforma Java, foi lançado em 19 de março de 2024 e trouxe diversas novidades, incluindo o recurso Statements before super. Essa funcionalidade, proposta no JEP 447 foi introduzida como uma prévia no JDK 21, permite que os desenvolvedores escrevam instruções antes da chamada ao construtor da superclasse super(…)
em classes Java.
Quais são os motivadores por trás dessa feature?
-
Facilitar a escrita de construtores mais legíveis e fáceis de manter: A separação das instruções de inicialização torna o código mais organizado e compreensível, especialmente em construtores complexos com diversas etapas de inicialização.
-
Reduzir a duplicação de código: Em alguns casos, o recurso pode eliminar a necessidade de métodos auxiliares ou argumentos de construtor redundantes, simplificando o código e diminuindo a quantidade de linhas de código.
-
Melhorar a expressividade da linguagem: A possibilidade de escrever instruções antes da chamada ao construtor da superclasse oferece maior flexibilidade aos desenvolvedores para expressar a lógica de inicialização de objetos de forma mais natural e intuitiva.
Exemplos de uso
1 - Validação de argumentos
Validando o argumento após a chamada ao método super, estamos aplicando uma carga de trabalho desnecessária.
public class PositiveAtomic extends AtomicInteger {
public PositiveAtomic(int value) {
super(value);
if (value < 0) {
throw new IllegalArgumentException();
}
}
}
A ideia é falhar rapidamente, validando os argumentos antes de invocar o construtor da superclass.
public class PositiveAtomic extends AtomicInteger {
public PositiveAtomic(int value) {
if (value < 0) {
throw new IllegalArgumentException();
}
super(value);
}
}
2 - Preparando argumentos
Com frequência, desejamos realizar alguma preparação no argumento antes de invocar o método da superclasse. Sem a nova funcionalidade do Java, precisamos criar métodos auxiliares estáticos.
public class JavaPost extends Header {
public JavaPost(Post post) {
super(preparePost(post));
}
public static String preparePost(Post post) {
if (!post.getTitle().startsWith("Java")) {
throw new IllegalArgumentException();
}
return post.getTitle();
}
}
Usando a nova funcionalidade do Java, incorporamos a lógica de preparação ao construtor, o que torna o código mais legível.
public class JavaPost extends Post {
public JavaPost(Post post) {
if (!post.getTitle().startsWith("Java")) {
throw new IllegalArgumentException();
}
super(post.getTitle());
}
}
3 - Instanciando novos objetos
Em certos cenários, é necessário recorrer a construtores auxiliares para criar novas instâncias de objetos complexos e transmiti-los como argumentos à superclasse. Abaixo, apresento um exemplo muito simples para ilustrar o potencial dessa nova funcionalidade em termos de legibilidade de código.
public class JavaPost extends PostWithImage {
private JavaPost(Post post, File image) {
super(post, image);
}
public JavaPost(Post post) {
this(post, new File(post.getFile()));
}
}
Observe a diferença ao utilizar a nova funcionalidade do Java, que simplifica significativamente a leitura do código.
public class JavaPost extends PostWithImage {
private JavaPost(Post post, File image) {
var file = new File(post.getFile());
super(post, file);
}
}
Considerações
É importante lembrar que o Statements before super é um recurso em prévia, o que significa que ainda está em desenvolvimento e pode sofrer alterações em futuras versões do Java. Além disso, o uso dessa funcionalidade exige cuidado para evitar erros de lógica, pois as instruções executadas antes da chamada ao construtor da superclasse não podem acessar campos de instância definidos na superclasse.
Conclusão
O Statements before super é uma adição valiosa ao Java que oferece maior flexibilidade e legibilidade na escrita de construtores de classes. Apesar de ser um recurso em prévia, é recomendável que os desenvolvedores experimentem essa funcionalidade para avaliar seus benefícios e potenciais aplicações em seus projetos.