Informationen zum Zurückgeben einer Referenz in einem Java Getter

Einführung

Ich habe Java-Code geschrieben und dachte, dass das Argument als Referenz übergeben wurde, aber der Rückgabewert der Methode gab die Referenz zurück, also habe ich es auch für den ersten Beitrag geschrieben.

Getter für das Objekt

Wenn Sie Java geschrieben haben, haben Sie wahrscheinlich Geschichten über das Erstellen von Gettern und Setzern gehört, ohne öffentliche Felder so oft wie möglich zu verwenden. In diesem Zusammenhang möchte ich diesmal einen Getter in Betracht ziehen, der ein Objekt wie eine Liste zurückgibt. Zuerst aus dem Code unten

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

Nun, es ist eine Klasse, die List umschließt. Als nächstes machen Sie die Haupt.

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

Wenn Sie dies tun, erhalten Sie:

a
b

Dadurch wird die private Liste in der Klasse von außen (Main) </ b> neu geschrieben. Mit anderen Worten, die Person, die die TestList-Klasse erstellt hat, kann unbeabsichtigte Änderungen vornehmen </ b>. Ist das nicht gefährlich, wenn man eine große Anzahl von Menschen entwickelt?

Lösung

Wenn Sie es nicht von außen ändern möchten, können Sie getList so ändern, dass ArrayList neu ist und dann wie unten gezeigt zurückgegeben wird.

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

Fazit

Wenn ich selbst einen Getter erstelle, kann ich nicht zu dem Schluss kommen, ob er wie oben oder wie unten geschrieben werden soll. Aus Sicht der Kapselung halte ich den folgenden Code jedoch für verdeckter. Bitte teilen Sie uns Ihre Meinung mit.

Recommended Posts