Bom dia, gostaria de entender porque o código abaixo altera a lista de “nomes” mesmo a lista sendo privada
@Getters
@Setters
public class Pessoas {
private List<String> nomes = new ArrayList<>();
}
public static void main (String[] args){
var pessoas = new Pessoas();
pessoas.getNomes().add("Joao");
}
é que esse código está bem enxuto, mas quando fazemos o Getter e Setter “convencional”, nós fazemos +/- assim:
private String publisher;
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
Então no final, vc não modifica diretamente o objeto publisher
. Você está modificando um método publico que é setPublisher();
,
ou no seu caso:
var pessoas = new Pessoas();
pessoas.getNomes().add("Joao"); //vc pega a lista e adiciona um valor
1 curtida
É o perfeito exemplo para mostrar que getters e setters não são sinônimo de encapsulamento.
Você tem uma lista private
mas tem um método public
que retorna uma referência para essa mesma lista.
Dessa forma, qualquer um consegue alterar o conteúdo dela.
3 curtidas
Sim, eu mesmo escrevi o código usando o lombok, oque eu fiquei na dúvida é porque eu não estou entendendo porque não é preciso usar o set nesse caso. No meu entendimento o código só funcionaria caso eu fizesse
public static void main (String[] args){
var pessoas = new Pessoas();
var nomes = pessoas.getNomes().add("Joao");
pessoas.setNomes(nomes);
}
Interessante, eu não tinha conhecimento disso, então isso ocorre porque o get retorna uma referência já que lista é uma classe? Se eu fizer um get que retorna um tipo primitivo não vou conseguir alterar ele se o set for do escopo?
Isso mesmo.
Você pode alterar o valor localmente, mas pra atualizar o valor do atributo, vai ter que fazer um set.
1 curtida