2014-12-12 1 views
5

Ich habe eine Anfängerfrage. Ich habe viel nach der Antwort gesucht, aber ich kann nicht die genaue Antwort finden, also kann vielleicht jemand von erfahreneren Entwicklern mir dabei helfen.Aufruf einer Methode und Übergabe einer Objektreferenz und Erfassung der Rückgabe mit derselben Referenz

So lassen Sie uns sagen, dass Sie eine folgende Situation in Code haben (diese Version der Situation vereinfacht):

SomeObject a1 = new SomeObject(); 
a1 = someMethod(a1); 

public SomeObject someMethod(SomeObject a1) { 
a1.changeVariable(); 
return a1; 
} 

jetzt hörte ich von mehreren Leuten sagen, dass ein Verweis auf ein Objekt auf ein Verfahren verläuft und den Rückgabewert zu fangen, ist eine schlechte Programmierpraxis. Leider kann mir niemand genau erklären, warum es eine schlechte Programmierpraxis ist und meine Suche nach dem Grund ergab nichts. Können einige erklären, warum es eine schlechte Übung ist, dies zu tun? Ich kann mir keine Situation vorstellen, in der etwas schief gehen kann.

Vielen Dank im Voraus, haben Sie nette Leute mir schon geholfen Antworten auf andere Menschen unzählige Male, ist dies ein erstes Mal, wenn ich eine Frage stellen tatsächlich benötigt :)

+1

Ich sehe keine "schlechte Praxis" in diesem, vor allem, wenn Sie unveränderliche Objekte bevorzugen. – Tom

+0

Was ist die Notwendigkeit in der Rückgabe von Wert .. Wenn wir das eigentlich nicht brauchen ??? – Srikanth

+0

@Srikanth Zum Beispiel: [Method Chaining] (http://en.wikipedia.org/wiki/Method_chaining#Java). – Tom

Antwort

5

In dem Szenario, Sie haben es gezeigt ist nicht viel offensichtlicher Vorteil. Als Muster kann es jedoch in meiner Erfahrung nützlich sein - vor allem, wenn die Methode Validierung durchführt.

Guavas Preconditions.checkNotNull Methode ist ein gutes Beispiel dafür. Es bedeutet, dass ich Code wie folgt schreiben kann:

public class Player { 
    private final String name; 

    public Player(String name) { 
     this.name = Preconditions.checkNotNull(name); 
    } 
} 

... anstatt die Zuordnung und die Validierung zu teilen. Es ermöglicht auch, dass die Validierung als Teil eines anderen Anrufs existiert, z. zu einem anderen Konstruktor:

super(Preconditions.checkNotNull(name)); 
+0

Ok, Sie sagen also, dass bei korrekter Anwendung außerhalb der unveränderlichen Situation nichts falsch daran ist, Code wie diesen zu schreiben.Wie Sie oben als Muster erwähnt haben, kann es gewisse Vorteile bei der Vereinfachung haben (ich nehme an, checkNotNull gibt zurück, was übergeben wurde, obwohl es in diesem Fall ein unveränderliches Objekt ist und wir stattdessen einen Verweis auf ein neues Objekt erhalten von dem, den wir bestanden haben). Sorry für diese Fragen, die vielleicht dumm klingen, aber ich beginne gerade mit Java und möchte von Anfang an ein solides Wissen über die Grundlagen bekommen. – Newbie

+0

@Newbie: In Ihrem Beispiel bekommen Sie * keinen * Verweis auf ein neues Objekt. Sie geben die gleiche Referenz zurück, die Sie eingegeben haben. Es klingt auch so, als hätten Sie ein paar Missverständnisse darüber, wie Referenzen und Objekte in Java funktionieren. Nichts erzeugt automatisch Kopien von Objekten, wenn eine Referenz an eine Methode übergeben wird ... –

+0

ja, sorry, ich habe über dein Beispiel gesprochen, aber es mit etwas verwechselt, das ich in einem anderen Artikel gelesen habe [link] (http://stackoverflow.com/questions/1270760/passing-a-string-by-reference-in-java) – Newbie