Alterando um atributo privado fora do escopo

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.

:wink:

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