-
Notifications
You must be signed in to change notification settings - Fork 82
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
docs: Create 16-records.md - Explicando como utilizar a classe record #43
Open
kaiquevieirasoares
wants to merge
9
commits into
paulorievrs:master
Choose a base branch
from
kaiquevieirasoares:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
1a99429
Create 16-records.md
kaiquevieirasoares 81acfff
docs: 4 - Intermediário/16-records.md - refatorando texto.
kaiquevieirasoares 742de08
docs: 4 - Intermediário/16-records.md - arrumando espaçamento.
kaiquevieirasoares 6821d9e
docs: 4 - Intermediário/16-records.md - removendo linha desnecessária..
kaiquevieirasoares 7a0b443
docs: 4 - Intermediário/16-records.md - refatorando texto.
kaiquevieirasoares 2eb8a2d
docs: 4 - Intermediário/16-records.md - refatorando texto.
kaiquevieirasoares 409b285
docs: 4 - Intermediário/16-records.md - refatorando texto.
kaiquevieirasoares 7c6a2a1
docs: 4 - Intermediário/16-records.md - refatorando texto.
kaiquevieirasoares 45054e1
docs: 4 - 16 - records.md - refatorando texto.
kaiquevieirasoares File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
# 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 tipo de classe foi introduzida oficialmente ao Java na versão 17, portanto, podemos utilizar em nossos programas. | ||
|
||
|
||
## Exemplo de uma classe tradicional | ||
|
||
```java | ||
import java.util.Objects; | ||
|
||
public class User { | ||
|
||
private String name; | ||
|
||
private String password; | ||
|
||
public User(String name, String password) { | ||
this.name = name; | ||
this.password = password; | ||
} | ||
|
||
public String getName() { | ||
return name; | ||
} | ||
|
||
public void setName(String name) { | ||
this.name = name; | ||
} | ||
|
||
public String getPassword() { | ||
return password; | ||
} | ||
|
||
public void setPassword(String password) { | ||
this.password = password; | ||
} | ||
|
||
@Override | ||
public boolean equals(Object o) { | ||
if (this == o) return true; | ||
if (o == null || getClass() != o.getClass()) return false; | ||
User user = (User) o; | ||
return name.equals(user.name) && password.equals(user.password); | ||
} | ||
|
||
@Override | ||
public int hashCode() { | ||
return Objects.hash(name, password); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return "User{" + | ||
"name='" + name + '\'' + | ||
", password='" + password + '\'' + | ||
'}'; | ||
} | ||
} | ||
|
||
``` | ||
|
||
Observe que a classe possui Getters e Setters para acessá-la, construtor e métodos implementados, como o `toString`. No entanto, dependendo da utilização essas informações podem ser redundantes e gerar replicação de código desnecessária. Assim, surgiram os records. | ||
|
||
## Exemplo utilizando Records. | ||
|
||
Observe como o código foi simplificado em apenas uma linha. Esse é o poder dessa classe, agora os métodos de acesso a classe não precisam ser criados manualmente, logo, serão instanciados de acordo com a necessidade do código. | ||
```java | ||
public record User(String name, String password){} | ||
``` | ||
|
||
Vamos instanciar um objeto User. | ||
|
||
```java | ||
User user = new User("admin", "45454*aa"); | ||
``` | ||
|
||
Agora vamos acessar esses dados. | ||
|
||
```java | ||
String name = user.name(); | ||
|
||
String password = user.password(); | ||
|
||
``` | ||
## Conclusão | ||
|
||
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 em classes tradicionais. | ||
|
||
- 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: | ||
|
||
- Imutabilidade e Encapsulamento: Os Records são projetados para ser imutáveis, o que significa que seus campos são finais e acessíveis apenas através de métodos de acesso. Como resultado, você não pode modificar os campos diretamente, e isso limita as formas como você pode personalizar equals(), hashCode(), e toString(), já que essas operações são geralmente baseadas no estado dos campos da instância. | ||
|
||
- 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. No entanto, o record pode implementar interfaces e fornecer implementações para métodos abstratos definidos na interface. Isso permite que você aproveite os benefícios dos records (como a imutabilidade e a concisão) enquanto adere aos contratos definidos por interfaces. A implementação de métodos de interface em records segue as mesmas regras e práticas que em classes comuns, com algumas considerações para a imutabilidade e os métodos automáticos fornecidos pelos records. | ||
|
||
- 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 gerados são todos públicos. |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Não acredito que a simplicidade dos records adicione complexidade. Pode ser que a adição de novas funções crie uma "barreira" inicial, por ser algo novo e diferente, mas o seu conceito é bem simples de se entender.
Várias documentações reforçam essa ideia de simplicidade e o objetivo de ser uma classe de transporte de dados.
Também ficou meio contraditório, visto que outro ponto acima menciona que é "mais fácil de ler e manter o código".