Novo:
public sealed class Shape permits Circle, Rectangle {
// Classe base selada
}
final class Circle extends Shape {
// Implementação para círculo
}
final class Rectangle extends Shape {
// Implementação para retângulo
}
Antes: Anteriormente, não havia uma maneira direta de limitar quais classes poderiam estender uma classe base, o que era menos seguro e dificultava a manutenção.
Novo:
if (obj instanceof String s) {
System.out.println(s.toUpperCase());
}
Antes:
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.toUpperCase());
}
Este recurso simplifica a verificação e o casting de tipos, reduzindo a redundância.
Novo:
public record Point(int x, int y) {}
Antes:
public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
return x == point.x && y == point.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
Records são uma maneira concisa e segura de criar classes de dados imutáveis.
Novo:
String html = """
<html>
<body>
<p>Hello, world!</p>
</body>
</html>
""";
Antes:
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world!</p>\n" +
" </body>\n" +
"</html>";
Text Blocks facilitam o trabalho com strings multilinhas, melhorando a legibilidade e manutenção do código.
Novo:
RandomGenerator random = RandomGeneratorFactory.of("L128X256MixRandom").create(12345);
Antes:
Random random = new Random(12345);
A nova API fornece uma abordagem mais rica e configurável para gerar números pseudo-aleatórios, suportando vários algoritmos.
Novo:
try (MemorySegment segment = MemorySegment.allocateNative(100)) {
MemoryAddress base = segment.baseAddress();
segment.setAtIndex(MemoryLayouts.JAVA_INT, 0, 123);
}
Antes: A interação direta com memória nativa era complexa e arriscada, geralmente realizada através de bibliotecas JNI, que são menos seguras e mais verbosas.
Este conjunto de funcionalidades melhora significativamente a robustez, segurança e legibilidade do código Java, alinhando-se com as práticas modernas de desenvolvimento de software.