A propos du renvoi d'une référence dans un Java Getter

introduction

J'écrivais du code Java et je pensais que l'argument était passé par référence, mais la valeur de retour de la méthode renvoyait la référence, alors je l'ai également écrite pour le premier message.

Obtention de l'objet

Si vous avez écrit Java, vous avez probablement entendu des histoires sur la création de Getters et Setters sans utiliser autant que possible les champs publics. À ce sujet, cette fois, je voudrais considérer un Getter qui renvoie un objet tel qu'une liste. D'abord à partir du code ci-dessous

TestList.java


public class TestList {
	private List<String> lst;
	
	public TestList(){
		this.lst = new ArrayList<String>();
	}
	public List<String> getList(){
		return lst;
	}
	public void setList(List<String> lst){
		this.lst = lst;
	}
}

Eh bien, c'est une classe qui enveloppe List. Ensuite, créez le fichier principal.

Main.java


public class Main {

	public static void main(String[] args) {
		TestList test = new TestList();
		List<String> l = test.getList();
		l.add("a");
		l.add("b");
		for (String s: test.getList()){
			System.out.println(s);
		}
	}
}

Lorsque vous faites cela, vous obtenez:

a
b

Il s'agit de réécrire la liste privée dans la classe de l'extérieur (Main) </ b>. En d'autres termes, la personne qui a créé la classe TestList peut apporter des modifications involontaires </ b>. N'est-ce pas dangereux pour développer un grand nombre de personnes?

Solution

Si vous ne souhaitez pas le modifier de l'extérieur, vous pouvez modifier getList afin que ArrayList soit nouveau, puis renvoyé comme indiqué ci-dessous.

TestList.java


public class TestList {
	private List<String> lst;
	
	public TestList(){
		this.lst = new ArrayList<String>();
	}
	public List<String> getList(){
		return new ArrayList<String>(lst);
	}
	public void setList(List<String> lst){
		this.lst = lst;
	}
}

Conclusion

Lorsque je crée moi-même un Getter, je ne peux pas arriver à une conclusion quant à savoir s'il doit être écrit comme ci-dessus ou comme ci-dessous. Cependant, du point de vue de l'encapsulation, je pense que le code ci-dessous est plus dissimulé. S'il vous plaît laissez-nous savoir ce que vous pensez.

Recommended Posts