In this article
Melhore sua aplicação Java com Records
Records são um novo recurso da linguagem Java, introduzido no JDK 16, que simplifica a criação de classes centradas em dados, usadas principalmente como contêineres de dados. Em outras palavras, records são uma forma concisa de declarar uma classe que funciona como um simples agrupador de dados, sem comportamentos complexos.
Records oferecem uma sintaxe compacta para declarar classes usadas principalmente para armazenar dados imutáveis, reduzindo o código repetitivo necessário ao trabalhar com essas classes. Assim, fica mais fácil e rápido criar e manter classes de dados, com menos chances de erros.
Veja um exemplo de como criar um record simples para representar um ponto em um espaço 2D:
```java
record Point(int x, int y) { }
```Essa única linha de código gera automaticamente um construtor, acessores para os campos e os métodos equals(), hashCode() e toString() com o comportamento adequado, reduzindo o código que precisa ser escrito e mantido.
A importância dos Records para aumentar a segurança de aplicações e aprimorar o desenvolvimento de software
Records oferecem vários benefícios:
Imutabilidade
Uma das principais características dos records é que eles são imutáveis por padrão. Objetos imutáveis são aqueles cujo estado não pode ser alterado depois de criados. Isso é importante para a segurança, pois reduz a probabilidade de modificações não autorizadas nos dados armazenados pelo record e dificulta a exploração de vulnerabilidades relacionadas a estados mutáveis.
A imutabilidade também traz benefícios para o desenvolvimento de software: facilita o raciocínio sobre o código e pode melhorar o desempenho de código concorrente ao reduzir a necessidade de sincronização.
Menos código repetitivo
Records ajudam a reduzir o código repetitivo ao gerar automaticamente métodos como equals(), hashCode() e toString(). Isso deixa o código mais conciso e fácil de ler, além de reduzir o risco de erros ou vulnerabilidades na implementação desses métodos.
Por exemplo, um problema de segurança comum relacionado ao método equals() é o risco de introduzir um ataque de temporização ao comparar dados sensíveis, como chaves criptográficas. Com Records e seus métodos gerados automaticamente, os desenvolvedores podem evitar o risco de introduzir esse tipo de vulnerabilidade.
Encapsulamento
Records incentivam boas práticas de encapsulamento ao exigir que os campos sejam declarados como parte da declaração do record. Isso deixa claro quais dados o record deve armazenar e garante que os campos sejam final e privados, reduzindo o risco de acesso ou modificação não autorizados.
Além disso, Records geram automaticamente acessores para os campos, que podem ser usados para aplicar verificações adicionais de segurança ou lógica de validação, se necessário.
Em resumo, Records em Java oferecem aos desenvolvedores uma maneira concisa e segura de criar classes centradas em dados, menos propensas a vulnerabilidades e mais fáceis de manter. Ao aproveitar os benefícios da imutabilidade, da redução de código repetitivo e do encapsulamento, Records podem ajudar a melhorar a segurança e a qualidade geral das suas aplicações Java.
Comparação com classes Java tradicionais
Antes da introdução dos Records, criar uma classe simples para transportar dados em Java exigia muito código repetitivo. Por exemplo, uma implementação tradicional da classe Point seria assim:
```java
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 obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Point other = (Point) obj;
return x == other.x && y == other.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
```
Como você pode ver, a implementação tradicional de uma classe Java é muito mais extensa do que a versão equivalente com Java Record. Com Records, os desenvolvedores podem se concentrar nos dados essenciais que as classes precisam transportar e dedicar menos tempo à escrita de código repetitivo. O resultado é um código mais limpo, fácil de manter e seguro, algo fundamental para a segurança de aplicações e as boas práticas de desenvolvimento de software.
Em resumo, Java Records oferecem uma maneira concisa e segura de criar classes simples para transportar dados, reduzindo o código repetitivo e aumentando a legibilidade e a facilidade de manutenção. Ao usar Records nos seus objetos de transferência de dados, você pode melhorar a segurança e a qualidade geral das suas aplicações Java.
Benefícios do uso de Java Records
Simplicidade do código
Nesta seção, veremos como o uso de Java Records pode tornar seu código mais simples e legível. Records são uma forma concisa de modelar classes que contêm apenas dados em Java, facilitando a manutenção e a compreensão da sua base de código. Isso é especialmente importante para a segurança de aplicações, pois códigos complexos podem levar a vulnerabilidades e dificultar a identificação e a correção de possíveis problemas.
Sintaxe concisa dos Records
Java Records foram introduzidos no JDK 14 como um recurso em versão de prévia e, mais tarde, tornaram-se um recurso padrão no JDK 16. Eles oferecem uma forma concisa de definir classes simples destinadas a armazenar dados. Com Records, os desenvolvedores podem reduzir o código repetitivo e melhorar a legibilidade. Veja um exemplo.
Considere uma classe Person simples, sem usar Records:
```java
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
```Agora, veja como a mesma classe Person pode ser representada usando Records:
```java
public record Person(String name, int age) {}
```Como você pode ver, a sintaxe dos Records é muito mais concisa e fácil de ler, o que faz deles uma ferramenta valiosa para simplificar e tornar o código mais legível.
Geração automática de métodos comuns
Outra vantagem do uso de Java Records é a geração automática de métodos comuns, como equals(), hashCode() e toString(). Esses métodos são essenciais para comparar objetos e exibir seu conteúdo em um formato legível.
Ao usar classes comuns, muitas vezes os desenvolvedores precisam implementar esses métodos manualmente, o que pode levar tempo e gerar erros. Já Records geram esses métodos automaticamente com base nos componentes declarados na definição do record.
Veja como isso pode beneficiar nosso exemplo de Person.
Em uma classe Person comum, você poderia implementar os métodos equals() e hashCode() assim:
```java
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
```E o método toString(), assim:
```java
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
```Porém, ao usar um Record, você não precisa implementar esses métodos manualmente. A mesma funcionalidade é gerada automaticamente para nosso Record Person:
```java
public record Person(String name, int age) {}
```Essa geração automática de métodos comuns ajuda a reduzir o código repetitivo e melhora a legibilidade, facilitando a manutenção de uma base de código segura e eficiente.
Em resumo, Java Records oferecem uma forma concisa e legível de definir classes que contêm apenas dados, reduzindo o código repetitivo e melhorando a facilidade geral de manutenção da aplicação. Aproveitando os benefícios dos Records, os desenvolvedores podem criar código mais seguro e eficiente, contribuindo para a postura geral de segurança da aplicação.
Mais legibilidade e facilidade de manutenção
Uma das principais vantagens do uso de Java Records é a capacidade de melhorar a legibilidade e a facilidade de manutenção do código. Records geram automaticamente implementações concisas e padronizadas de métodos comuns, como equals(), hashCode() e toString(). Isso reduz o código repetitivo e elimina possíveis bugs e inconsistências.
Veja o exemplo a seguir de uma classe Java tradicional:
```java
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 obj) {
// ... implementation ...
}
@Override
public int hashCode() {
// ... implementation ...
}
@Override
public String toString() {
// ... implementation ...
}
}
```Agora, compare com o Java Record equivalente:
```java
public record Point(int x, int y) {}
```Como você pode ver, a versão com Record é muito mais curta, fácil de ler e menos propensa a erros.
Imutabilidade e segurança
A imutabilidade é um aspecto essencial da segurança de aplicações. Quando os objetos são imutáveis, não podem ser modificados depois de criados, o que ajuda a prevenir vários problemas de segurança, como adulteração não autorizada de dados e condições de corrida.
Java Records são inerentemente imutáveis, pois seu estado é definido pelos campos final que correspondem aos componentes do record. Isso significa que, depois de criado, o estado de um objeto record não pode ser alterado, tornando-o uma opção segura para modelar seus dados.
```java
public final class ImmutablePerson {
private final String firstName;
private final String lastName;
public ImmutablePerson(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
```Prevenção contra manipulação involuntária de dados
A imutabilidade oferece uma forte defesa contra a manipulação ou corrupção involuntária de dados. Quando um objeto é imutável, seu estado não pode ser alterado por código externo nem por agentes mal-intencionados. Isso impede modificações não autorizadas nos dados do objeto e preserva a integridade do estado da aplicação.
Considere uma aplicação que gerencia dados confidenciais de usuários. Se os dados forem armazenados em objetos mutáveis, um invasor poderá obter acesso não autorizado e modificá-los. Ao usar objetos imutáveis, você pode impedir esse tipo de ataque, pois o invasor não consegue alterar o estado desses objetos.
```java
public class SensitiveData {
private final ImmutablePerson owner;
private final String secret;
public SensitiveData(ImmutablePerson owner, String secret) {
this.owner = owner;
this.secret = secret;
}
public ImmutablePerson getOwner() {
return owner;
}
public String getSecret() {
return secret;
}
}
```Redução da superfície de ataque vulnerável
Objetos imutáveis ajudam a reduzir a superfície de ataque de uma aplicação Java ao limitar as possibilidades de exploração do código por invasores. Com um objeto imutável, há menos pontos de entrada para que um invasor manipule o estado da aplicação.
Em objetos mutáveis tradicionais, cada método setter ou campo público pode ser um ponto de ataque. Ao eliminar esses métodos e campos, você reduz significativamente a possibilidade de uma vulnerabilidade de segurança decorrente de alterações não autorizadas nos dados da aplicação.
Java Records, introduzidos no JDK 16, facilitam a criação de classes de dados imutáveis com o mínimo de código repetitivo. Records são implicitamente final e seus campos são imutáveis. Eles geram automaticamente construtores, acessores e os métodos equals(), hashCode() e toString() com base nos campos declarados.
```java
public record ImmutablePersonRecord(String firstName, String lastName) { }
```Esse record equivale à classe ImmutablePerson que definimos anteriormente, com o benefício adicional de exigir menos código repetitivo.
Em resumo, a imutabilidade é um conceito poderoso que pode melhorar significativamente a segurança e a resiliência das suas aplicações Java. Objetos imutáveis podem prevenir a manipulação involuntária de dados, reduzir a superfície de ataque e garantir a integridade do estado da aplicação. Considere usar Java Records ou outras técnicas para adotar a imutabilidade nas suas aplicações Java e fortalecer sua postura de segurança.
Melhor desempenho
Records podem melhorar o desempenho da sua aplicação graças à simplicidade e à imutabilidade. A imutabilidade possibilita várias otimizações, como armazenar em cache os resultados de cálculos custosos ou reduzir a necessidade de sincronização em ambientes multithread.
Além disso, Records oferecem implementações mais eficientes dos métodos equals(), hashCode() e toString(), o que pode melhorar o desempenho quando esses métodos são usados com frequência, por exemplo, em coleções ou pipelines de processamento de dados.
Redução do código repetitivo
Java Records são um recurso introduzido no JDK 14 que simplifica a criação de classes de dados. Com Records, você elimina a necessidade de escrever código repetitivo, como métodos getter e setter e os métodos equals(), hashCode() e toString(). Records geram esses métodos automaticamente com base nas propriedades fornecidas.
Para demonstrar como reduzir o código repetitivo, vamos criar uma classe Person simples usando Java tradicional e, em seguida, criar a mesma classe com um Record.
**Classe Java tradicional:**
```java
public class Person {
private final String firstName;
private final String lastName;
private final int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
// ... implementation here
}
@Override
public int hashCode() {
// ... implementation here
}
@Override
public String toString() {
// ... implementation here
}
}
```**Versão com Record:**
```java
public record Person(String firstName, String lastName, int age) {}
```Como você pode ver, a versão com Record da classe Person é muito mais concisa e fácil de ler. Isso não só melhora a legibilidade do código, como também reduz a chance de introduzir bugs por erro humano ao escrever código repetitivo.
Uso otimizado de memória
Outra melhoria de desempenho proporcionada pelo uso de Records é a otimização do uso de memória. Como Records são imutáveis e suas propriedades são final, a JVM pode otimizar a memória com mais eficiência. Isso é especialmente útil quando há muitas instâncias de uma classe e você quer minimizar o espaço ocupado na memória.
Por exemplo, imagine que você tem uma aplicação que processa uma lista de objetos Person. Em uma classe Java tradicional, cada objeto Person terá memória alocada para armazenar as propriedades firstName, lastName e age.
No entanto, ao usar um Record, a JVM pode otimizar o uso de memória compartilhando as propriedades entre instâncias com os mesmos valores. Isso pode gerar uma economia significativa de memória quando há vários objetos com os mesmos valores de propriedade.
Além disso, por serem imutáveis, os Records permitem um uso mais eficiente da memória em cenários de programação concorrente.
Em resumo, os Records do Java são um recurso poderoso que pode ajudar você a melhorar o desempenho das aplicações Java, reduzindo o código repetitivo e otimizando o uso de memória. Ao adotar Records nos seus projetos, você pode escrever um código mais limpo e fácil de manter, além de melhorar o desempenho das aplicações.
Fácil integração com o código existente
Os Records do Java foram projetados para funcionar perfeitamente com o código e as bibliotecas Java existentes. Assim, você pode introduzi-los gradualmente na sua aplicação, sem precisar fazer uma reescrita ou reformulação significativa. É fácil converter classes existentes em Records, que também podem ser usados como argumentos de métodos, valores de retorno ou em estruturas de dados, assim como qualquer outro objeto Java.
Como usar Records do Java na sua aplicação
Configurando seu ambiente de desenvolvimento
Para começar a melhorar sua aplicação Java com Records, configure corretamente seu ambiente de desenvolvimento. Nesta seção, vamos abordar a versão necessária do JDK e o suporte das IDEs a Records do Java.
Versão necessária do JDK
Os Records do Java foram introduzidos como recurso de prévia no JDK 14 e finalizados no JDK 16. Portanto, para usar Records do Java, você precisa ter pelo menos o JDK 16 instalado no sistema. Você pode baixá-lo no [site oficial da Oracle](https://www.oracle.com/java/technologies/javase-jdk16-downloads.html).
Para verificar a versão do JDK instalada, abra o terminal ou o prompt de comando e execute o seguinte comando:
```sh
java -version
```Confira se a saída exibe o JDK 16 ou superior. Se você tiver várias versões do JDK instaladas, poderá definir a variável de ambiente JAVA_HOME para apontar para o diretório de instalação do JDK 16.
Suporte das IDEs a Records do Java
A maioria das IDEs modernas oferece suporte a Records do Java. Veja abaixo as etapas para configurar algumas IDEs populares:
IntelliJ IDEA
O IntelliJ IDEA oferece suporte a Records do Java a partir da versão 2020.1. Confira se você tem a versão mais recente do IntelliJ IDEA instalada. Para configurar o JDK no IntelliJ IDEA, siga estas etapas:
1. Abra o IntelliJ IDEA e crie um projeto ou abra um projeto existente.
2. Acesse File > Project Structure.
3. Na seção Project Settings, clique em Project.
4. Defina Project SDK como JDK 16 ou superior. Se essa opção não estiver disponível, clique em New... e selecione o diretório de instalação do JDK 16.
5. Defina Project language level como 16 - Records, sealed types, patterns, local enums, and interfaces.
6. Clique em OK para salvar as alterações.
Pronto: o IntelliJ IDEA está configurado para trabalhar com Records do Java.
Eclipse
O Eclipse oferece suporte a Records do Java a partir da versão 4.16 (2020-06). Confira se você tem a versão mais recente do Eclipse instalada. Para configurar o JDK no Eclipse, siga estas etapas:
1. Abra o Eclipse e crie um projeto Java ou abra um projeto existente.
2. Clique com o botão direito do mouse no projeto em Package Explorer e selecione Properties.
3. Na seção Java Build Path, clique na guia Libraries.
4. Clique em Add Library..., selecione JRE System Library e clique em Next.
5. Escolha Workspace default JRE e selecione JDK 16 ou superior na lista suspensa. Clique em Finish.
6. Na seção Java Compiler, defina Compiler compliance level como 16.
7. Clique em Apply and Close para salvar as alterações.
Pronto: o Eclipse está configurado para trabalhar com Records do Java.
Visual Studio Code
O Visual Studio Code oferece suporte a Records do Java por meio da extensão [Language Support for Java(TM) by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java). Confira se você tem a versão mais recente do Visual Studio Code e a extensão Java instaladas. Para configurar o JDK no Visual Studio Code, siga estas etapas:
1. Abra o Visual Studio Code e crie um projeto Java ou abra um projeto existente.
2. Pressione Ctrl+Shift+P (ou Cmd+Shift+P no macOS) para abrir a paleta de comandos.
3. Digite Java: Configure Java Runtime e pressione Enter.
4. Na seção Java Tooling Runtime, clique em JDK e selecione JDK 16 ou superior na lista suspensa.
5. Reinicie o Visual Studio Code para aplicar as alterações.
Pronto: o Visual Studio Code está configurado para trabalhar com Records do Java.
Com o ambiente de desenvolvimento configurado, você já pode começar a usar Records do Java para melhorar a legibilidade, a imutabilidade e a segurança da sua aplicação Java.
Criando um Record
Nesta seção, vamos abordar a sintaxe básica e a estrutura dos Records do Java e mostrar um exemplo de código que demonstra como criar uma declaração simples de Record. Records são um recurso prático, introduzido como recurso de prévia no Java 14 e finalizado no Java 16, que simplifica a criação de classes de dados. Um Record é, essencialmente, uma classe usada para armazenar dados imutáveis com o mínimo de código repetitivo.
Sintaxe e estrutura básicas
A sintaxe básica para declarar um Record em Java é a seguinte:
```java
record RecordName (Type1 field1, Type2 field2, ..., TypeN fieldN) {
// Additional methods and logic can be added here
}
```Uma declaração de Record consiste na palavra-chave record, seguida pelo nome do Record e por uma lista de campos entre parênteses. Os campos são declarados com seus respectivos tipos e nomes, separados por vírgulas. O corpo do Record, delimitado por chaves, pode conter métodos e lógica adicionais, se necessário.
Veja os principais recursos dos Records:
1. Por padrão, Records são imutáveis. Isso significa que, depois que uma instância de Record é criada, os valores dos campos não podem ser alterados.
2. Os campos de um Record são finais e, portanto, não podem ser modificados.
3. Records geram automaticamente implementações padrão dos seguintes métodos: equals(), hashCode(), toString() e os métodos de acesso (getters) de cada campo.
4. Records podem ter métodos e lógica adicionais, mas não podem ter campos de instância mutáveis.
Exemplo de código: declaração simples de Record
Neste exemplo, vamos criar uma declaração simples de Record chamada Person, com três campos: firstName, lastName e age.
```java
public record Person(String firstName, String lastName, int age) {
// Additional methods and logic can be added here, if needed
}
```Agora, vamos criar uma instância do Record Person e demonstrar o funcionamento dos métodos gerados automaticamente:
```java
public class Main {
public static void main(String[] args) {
Person person = new Person("John", "Doe", 30);
// Accessor methods (getters) are automatically generated
String firstName = person.firstName();
String lastName = person.lastName();
int age = person.age();
// Default implementation of toString()
System.out.println(person); // Output: Person[firstName=John, lastName=Doe, age=30]
// Default implementation of equals()
Person person2 = new Person("John", "Doe", 30);
System.out.println(person.equals(person2)); // Output: true
}
}
```Como você pode ver, conseguimos criar uma declaração simples de Record com pouco código repetitivo, e os métodos de acesso gerados, toString() e equals(), funcionam como esperado.
Em resumo, Records do Java são uma maneira concisa e prática de criar classes de dados imutáveis, com o mínimo de código. Com eles, você pode melhorar a legibilidade e a facilidade de manutenção das suas aplicações Java e também aumentar a segurança ao garantir a imutabilidade.
Adicionando métodos e validação a Records
Os Records do Java, introduzidos no JDK 16, são uma nova maneira de criar classes de dados simples e concisas, voltadas ao armazenamento de dados mutáveis. Embora Records tenham sido projetados principalmente para serem imutáveis e conter apenas métodos de acesso simples, ainda é possível adicionar métodos personalizados e lógica de validação. Nesta seção, vamos explorar como adicionar esses métodos e essa lógica a Records do Java para melhorar a segurança e a robustez da sua aplicação.
Adicionando métodos personalizados a Records
Uma das vantagens de usar Records é que eles geram automaticamente métodos de acesso, equals(), hashCode() e toString(). No entanto, talvez você queira adicionar métodos personalizados para cálculos ou operações específicas relacionadas aos dados armazenados no Record. Para isso, basta definir o método personalizado no corpo do Record. Observe que esses métodos não devem modificar os dados armazenados no Record, para preservar a imutabilidade.
Veja um exemplo de como adicionar um método personalizado a um Record:
```java
record Employee(String name, int age, double salary) {
public double calculateYearlyBonus() {
return salary * 0.1;
}
}
```Neste exemplo, adicionamos o método personalizado calculateYearlyBonus() ao Record Employee. Esse método calcula o bônus anual com base no salário do funcionário.
Exemplo de código: adicionando validação a um Record
Adicionar validação a um Record é essencial para garantir que os dados armazenados nele sejam válidos e seguros. A validação pode ajudar a evitar vulnerabilidades de segurança, como adulteração de dados ou ataques de injeção. Para adicionar validação a um Record, você pode usar o construtor compacto, uma forma concisa de definir um construtor sem especificar os parâmetros explicitamente.
Veja um exemplo de como adicionar validação a um Record:
```java
record EmailAddress(String email) {
public EmailAddress {
if (email == null || email.isBlank()) {
throw new IllegalArgumentException("Email cannot be null or blank");
}
if (!isValidEmail(email)) {
throw new IllegalArgumentException("Invalid email format");
}
}
private static boolean isValidEmail(String email) {
// Use a regex pattern or a library to validate the email format
// For simplicity, we use a basic regex pattern here
String emailPattern = "^[A-Za-z0-9+_.-]+@(.+)$";
return email.matches(emailPattern);
}
}
```Neste exemplo, adicionamos validação ao Record EmailAddress para garantir que o e-mail não seja nulo nem esteja em branco e tenha um formato válido. Usamos um construtor compacto para adicionar a lógica de validação e um método privado, isValidEmail(), para verificar o formato do e-mail.
Com essas técnicas, você pode melhorar a segurança e a robustez das suas aplicações Java adicionando métodos personalizados e lógica de validação aos seus Records. Assim, você garante que os dados da aplicação continuem seguros e válidos, melhorando sua qualidade e resiliência.
Usando Records com outros recursos do Java
Os Records do Java, introduzidos como recurso de prévia no JDK 14 e finalizados no JDK 16, trazem mais simplicidade e concisão à linguagem. Eles são especialmente úteis para modelar classes que transportam dados, as quais tradicionalmente exigem muito código repetitivo. Nesta seção, vamos explorar como usar Records com outros recursos do Java, como interfaces e herança, para melhorar a segurança do código e a facilidade de manutenção da sua aplicação.
Records e interfaces
Embora um Record não possa estender outra classe, ele ainda pode implementar uma ou mais interfaces. Isso permite usar Records com padrões de projeto estabelecidos e aproveitar as vantagens tanto dos Records quanto das interfaces na sua aplicação. Veja um exemplo simples.
Suponha que temos uma interface chamada Displayable, que representa objetos que podem ser exibidos na tela:
```java
public interface Displayable {
String display();
}
```Podemos criar um Record que implemente essa interface:
```java
public record Person(String name, int age) implements Displayable {
@Override
public String display() {
return "Name: " + name + ", Age: " + age;
}
}
```Neste exemplo, o Record Person implementa a interface Displayable e fornece uma implementação concreta do método display(). Isso permite usar o Record Person em qualquer contexto que espere um objeto Displayable.
Records e herança
Como mencionado anteriormente, Records não podem estender outras classes. Isso acontece porque eles são implicitamente finais e herdam da classe java.lang.Record, o que os impede de participar da herança tradicional entre classes. No entanto, Records ainda podem fazer parte de uma hierarquia de tipos por meio de interfaces, como no exemplo anterior.
É importante lembrar que Records não devem ser usados como classe base para outras classes. Seu objetivo principal é servir como estruturas simples e imutáveis para transportar dados. Estendê-los com funcionalidades adicionais pode causar efeitos colaterais indesejados e aumentar a complexidade.
Exemplo de código: combinando Records com outros recursos do Java
Agora que entendemos o básico sobre como Records podem funcionar com interfaces e herança, vamos ver um exemplo prático. Suponha que estamos trabalhando em uma aplicação de gerenciamento de projetos e queremos modelar diferentes tipos de tarefas.
Podemos começar definindo uma interface Task:
```java
public interface Task {
String getDescription();
int getPriority();
boolean isCompleted();
}
```Em seguida, podemos criar um Record para cada tipo de tarefa, implementando a interface Task:
```java
public record BugFix(String description, int priority) implements Task {
@Override
public boolean isCompleted() {
// Implement logic to determine if the bug fix is completed
}
}
public record Feature(String description, int priority) implements Task {
@Override
public boolean isCompleted() {
// Implement logic to determine if the feature is completed
}
}
```Neste exemplo, temos dois Records, BugFix e Feature, que implementam a interface Task. Isso permite tratar os dois tipos de tarefa de maneira uniforme na aplicação de gerenciamento de projetos, aproveitando a simplicidade e a imutabilidade dos Records.
Priorize o que mais importa
As organizações precisam de uma abordagem holística para priorizar riscos. Use a priorização contextual baseada em riscos da Snyk.