Conheça o recurso de Records no Java \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 09 Horas 

 46 Min 

 59 Seg 

   Tempo restante da oferta: 09 46 59 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Conheça o recurso de Records no Java  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

# Conheça o recurso de Records no Java

 Neste artigo, vamos aprender sobre o recurso de Records no Java. Veremos como utilizar esse recurso, suas vantagens e desvantagens.

 [ Cleyson Lima ](https://www.treinaweb.com.br/blog/autor/cleyson-lima) 4 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/como-instalar-o-java-e-nosso-primeiro-exemplo.png)  

O [Java](https://www.treinaweb.com.br/blog/guia-da-linguagem-java) é uma linguagem bastante conhecida pela sua verbosidade, e isso é um fato. Mas, com o passar dos anos, a linguagem vem ganhando novos recursos que tornam o código mais conciso e legível. Além disso, também existem bibliotecas que ajudam a diminuir a quantidade de código que precisamos escrever. Uma dessas bibliotecas é o [Lombok](https://www.treinaweb.com.br/blog/projeto-lombok-acelerando-o-desenvolvimento-java). Neste artigo, vamos conhecer um recurso do Java que é bastante útil e foi introduzido no Java 14: os [Records](https://openjdk.org/jeps/395).

[  ![Java - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/java.svg)   Curso Java - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/java-fundamentos)

## O que são Records?

Os Records são uma nova forma de declarar classes no Java. Eles são imutáveis por padrão, o que significa que não podemos alterar seus valores após a criação do objeto. Além disso, eles são bastante úteis para representar dados, como, por exemplo, uma entidade de banco de dados.

Esse recurso foi introduzido no Java 14 como experimental, e a partir do Java 16 foi marcado como estável. Isso significa que podemos utilizá-lo em nossos projetos sem medo de que ele seja removido em uma versão futura do Java.

## Quais as vantagens e desvantagens de utilizar Records?

O recurso de Records no Java nos dá algumas vantagens, como, por exemplo:

- **Sintaxe mais concisa**: Records permitem definir classes de dados imutáveis de forma mais concisa, eliminando a necessidade de escrever o código repetitivo que normalmente é necessário para definir uma classe Java.
- **Redução de código boilerplate**: Como os Records fornecem métodos padrão, como `equals()`, `hashCode()` e `toString()`, eles reduzem a quantidade de código boilerplate necessário para definir uma classe Java.
- **Imutabilidade**: Como os Records são imutáveis por padrão, eles fornecem uma maneira mais segura e fácil de trabalhar com dados imutáveis.
- **Mais fácil de ler e manter**: A sintaxe simplificada do Records torna mais fácil de ler e manter o código, pois é mais fácil de entender a intenção do código.
- **Melhor compatibilidade com APIs existentes**: Os Records foram projetados para serem compatíveis com as APIs existentes, permitindo que os desenvolvedores usem Records em conjunto com outras classes Java sem problemas.

Por outro lado, eles também possuem algumas desvantagens, como, por exemplo:

- **Restrições na personalização de métodos**: Por padrão, os Records fornecem métodos padrão, como `equals()`, `hashCode()` e `toString()`, que não podem ser personalizados. Embora seja possível fornecer uma implementação personalizada desses métodos, isso pode ser menos conveniente do que simplesmente estendê-los ou anulá-los em uma classe normal.
- **Limitações na herança**: Os Records não suportam herança de classe, o que significa que não é possível estender um Record em outra classe. Isso pode ser um problema se você precisar adicionar funcionalidade a uma classe Record existente.
- **Maior complexidade em casos complexos**: Em casos complexos, os Records podem se tornar mais difíceis de entender e manter do que as classes Java normais, devido a uma sintaxe mais compacta e a recursos específicos que podem ser difíceis de entender.
- **Restrições de visibilidade**: a visibilidade dos campos e métodos em um record é limitada. Todos os campos são automaticamente finais e privados, e os métodos são todos públicos.

## Como declarar um Record?

Para declarar um Record, precisamos utilizar a palavra-chave `record` seguida do nome da classe. Em seguida, devemos declarar os campos que o Record terá, declarados como se fossem variáveis locais. Por fim, devemos declarar o construtor da classe, declarado como se fosse um método. Veja o exemplo abaixo:

```java
public record Person(String name, int age) {}

```

No exemplo acima, criamos um Record chamado `Person` que possui dois campos: `name` e `age`. O Record acima é equivalente à classe abaixo:

```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;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + age;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (age != other.age)
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

```

Como podemos ver, o recurso de Records no Java diminui bastante a quantidade de código que precisamos escrever para criar uma classe.

## Como acessar os campos de um Record?

[  ![Java - Orientação a objetos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/java.svg)   Curso Java - Orientação a objetos Conhecer o curso ](https://www.treinaweb.com.br/curso/java-orientacao-a-objetos)

Para acessar os campos de um Record, podemos utilizar os métodos `get()` que são gerados automaticamente. Veja o exemplo abaixo:

```java
public class Main {

    public static void main(String[] args) {
        Person person = new Person("John", 30);
        System.out.println(person.name());
        System.out.println(person.age());
    }

}

```

Aqui podemos ver uma particularidade dos Records, os métodos acessores são gerados com o mesmo nome dos campos, ou seja, não precisamos utilizar o prefixo `get` para acessar os campos. Além disso, os métodos assessores são gerados como `public`, o que significa que podemos acessá-los de qualquer lugar.

## Customizando construtores

Por padrão, os Records geram um construtor público com todos os campos como parâmetros. No entanto, podemos personalizar o construtor de um Record. Geralmente isso é feito para aplicar validações nos campos do Record. Veja o exemplo abaixo:

```java
public record Person(String name, int age) {

    public Person {
        if (name == null) {
            throw new IllegalArgumentException("Name cannot be null");
        }
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
    }

}

```

No exemplo acima, criamos um construtor personalizado para o Record `Person`. Nesse construtor, verificamos se o nome é nulo e se a idade é negativa. Caso seja, lançamos uma exceção.

Também podemos criar mais de um construtor para um Record, por exemplo, podemos criar um construtor que recebe apenas o nome e define a idade como 0. Veja o exemplo abaixo:

```java
public record Person(String name, int age) {

    public Person(String name, int age) {
        this(name, age);
    }

    public Person(String name) {
        this(name, 0);
    }

}

```

No exemplo acima, criamos dois construtores personalizados para o Record `Person`. O primeiro construtor recebe o nome e a idade como parâmetros e o segundo construtor recebe apenas o nome como parâmetro. No segundo construtor, definimos a idade como 0.

É importante observar que a sintaxe que utilizamos no primeiro exemplo para criar um construtor personalizado difere da sintaxe que utilizamos no segundo exemplo. A do primeiro exemplo é chamada de construtor compacto.

## Onde utilizar Records?

[  ![Spring Framework - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/spring-boot.svg)   Curso Spring Framework - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/spring-framework-fundamentos)

Os Records são uma ótima opção para representar dados, como, por exemplo, DTOs (Data Transfer Objects). Além disso, eles são uma ótima opção para representar dados que não precisam ser alterados após a criação do objeto, como, por exemplo, configurações de aplicação.

Um ponto importante a se considerar é que os Records não são uma boa opção para representar entidades de banco de dados, pois eles não suportam herança, o que significa que não é possível estender um Record em outra classe. Além disso, pelo fato de os Records serem imutáveis por padrão, eles não podem ser utilizados para representar entidades da JPA (Java Persistence API), pois a JPA necessita de entidades mutáveis.

## Conclusão

Neste artigo, vimos como utilizar o recurso de Records no Java. O recurso de Records no Java nos permite criar classes de dados imutáveis de forma mais concisa, eliminando a necessidade de escrever o código repetitivo que normalmente é necessário para definir uma classe Java.

Além disso, eles também nos dão algumas vantagens, como, por exemplo, uma sintaxe mais concisa, redução de código boilerplate, imutabilidade, mais fácil de ler e manter, e melhor compatibilidade com APIs existentes. Por outro lado, eles também possuem algumas desvantagens, como, por exemplo, restrições na personalização de métodos, limitações na herança, maior complexidade em casos complexos, e restrições de visibilidade.

Caso queira aprender mais sobre o Java, saiba que aqui na [TreinaWeb](https://www.treinaweb.com.br/) nós temos a formação [Desenvolvedor Java](https://www.treinaweb.com.br/formacao/desenvolvedor-java) que possui **91h15 de vídeo** e um total de **484 exercícios**.

Veja quais são os cursos que fazem parte desta formação:

- Java - Fundamentos
- Java - Configurando o VS Code
- Java - Orientação a objetos
- Java - Algoritmos - Parte 1
- Java - Estrutura de dados - Parte 1
- Java - Estrutura de dados - Parte 2
- Java - Collections - Parte 1
- Java - Collections - Parte 2
- Java - Stream API
- XML Completo
- XSLT Completo
- Java - Fundamentos de JavaFx
- Projeto de Banco de dados - Fundamentos
- MySQL - Desenvolvedor
- Oracle - Desenvolvedor
- Java - Banco de dados e JDBC
- Java - Arquivos e I/O API
- Java - Introdução à JPA
- Java - Fundamentos para Web
- Java - Fundamentos de Struts 2
- Java - Fundamentos de JAX-WS e JAX-RS
- Java - Testes unitários com JUnit 5
- HTTP - Fundamentos para desenvolvedores
- Java - Consumindo APIs

- [ #Java ](https://www.treinaweb.com.br/blog/tag/java)
- [ #java records ](https://www.treinaweb.com.br/blog/tag/java-records)
- [ #records ](https://www.treinaweb.com.br/blog/tag/records)
- [ #java 16 ](https://www.treinaweb.com.br/blog/tag/java-16)

Autor

 ![Cleyson Lima](//secure.gravatar.com/avatar/db30efb102ffa5d5204cebe12060b111?d=mm)

## Cleyson Lima

 Professor, programador, fã de One Piece e finge saber cozinhar. Cleyson é graduando em Licenciatura em Informática pelo IFPI - Campus Teresina Zona Sul, nos anos de 2019 e 2020 esteve envolvido em vários projetos coordenados pela secretaria municipal de educação da cidade de Teresina, onde o foco era introduzir alunos da rede pública no mundo da programação e robótica. Hoje é instrutor dos cursos de Spring na TreinaWeb, mas diz que seu coração sempre pertencerá ao Python. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/cleyson-lima)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/11/03082200/ORM-CAPA-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ O que é ORM? ](https://www.treinaweb.com.br/blog/o-que-e-orm) 

     Nesse artigo aprenderemos o que é ORM, quais problemas ele resolve, os padrões mais usados e quais os principais ORMs do mercado.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/11/C-SHARP-PROPRIEDADES-INIT-RECORD-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ C# 9.0 - Inteiros nativos e inferência de tipos ](https://www.treinaweb.com.br/blog/c-9-0-inteiros-nativos-e-inferencia-de-tipos) 

     Conheça os novos tipos de dados introduzidos no C# 9.0, os inteiros nativos e os novos recursos da inferência de tipos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/05/03175136/NET-CORE-2.1-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     9 anos atrás

    ##  [ Global Tools no .NET Core 2.1 ](https://www.treinaweb.com.br/blog/global-tools-no-net-core-2-1) 

     Conheça o recurso de global tool adicionado na versão 2.1 do .NET Core e aprenda como definir uma a partir de um projeto console.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/Coding-400x280.jpg)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     10 anos atrás

    ##  [ Ref Returns no C# 7 ](https://www.treinaweb.com.br/blog/ref-returns-no-csharp-7) 

     Conheça um pouco mais sobre o recurso Ref Returns da versão 7 do C#.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/wordpress-background-1-400x280.jpg)  [ WordPress ](https://www.treinaweb.com.br/blog/categoria/wordpress) 

     10 anos atrás

    ##  [ Conheça o tipo de plugin Must-use do WordPress ](https://www.treinaweb.com.br/blog/conheca-o-tipo-de-plugin-must-use-do-wordpress) 

     No tipo mu-plugin do WordPress os plugins ficam sempre ativos e devem ser usados para funções essenciais do projeto.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/devdocs-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     10 anos atrás

    ##  [ Acesse a documentação das suas linguagens favoritas com o DevDocs.io ](https://www.treinaweb.com.br/blog/acesse-a-documentacao-das-suas-linguagens-favoritas-com-o-devdocs-io) 

     Conheça a ferramenta que agrega documentações e facilita a vida dos desenvolvedores.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/10/06103451/cobertura-codigos-testes-automatizados-400x280.jpg)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     9 anos atrás

    ##  [ Analisando a cobertura de testes em aplicações .NET com o OpenCover ](https://www.treinaweb.com.br/blog/analisando-cobertura-de-testes-em-aplicacoes-net-com-o-opencover) 

     Conheça o OpenCover, ferramenta open-source para análise de cobertura de testes.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Conhecendo variáveis e constantes na Golang ](https://www.treinaweb.com.br/blog/conhecendo-variaveis-e-constantes-na-golang) 

     Conheça neste artigo os tipos de dados presentes e a sintaxe para que possamos declarar variáveis e constantes na Golang.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/05/como-instalar-o-csharp-e-nosso-primeiro-exemplo-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     4 anos atrás

    ##  [ Conhecendo variáveis e constantes no C# ](https://www.treinaweb.com.br/blog/conhecendo-variaveis-e-constantes-no-csharp) 

     Conheça neste artigo os tipos de dados presentes no C# e a sintaxe para que possamos declarar variáveis e constantes.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/05/03175136/NET-CORE-2.1-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     8 anos atrás

    ##  [ Novos recursos do ASP.NET Core 2.1 ](https://www.treinaweb.com.br/blog/novos-recursos-do-asp-net-core-2-1) 

     Conheça os novos recursos do ASP.NET Core 2.1.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/04/03142818/GOOGLE-COMPUTE-ENGINE-400x280.png)  [ Google Cloud Platform (GCP) ](https://www.treinaweb.com.br/blog/categoria/google-cloud-platform-gcp) 

     9 anos atrás

    ##  [ Criando instâncias de VM no Google Cloud Platform ](https://www.treinaweb.com.br/blog/criando-instancias-de-vm-no-google-cloud-platform) 

     Conheça o compute engine e veja como criar novas instâncias de VM no Google Cloud Platform.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/img-wlad-blog-400x280.jpg)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     10 anos atrás

    ##  [ Binary Literals, Digit Separators e Throw Expressions no C# 7.0 ](https://www.treinaweb.com.br/blog/binary-literals-digit-separators-e-throw-expressions-no-csharp-7) 

     Conheça os recursos Binary Literals, Digit Separators e Throw Expressions da versão 7 do C#.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **09h 46min 59s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
