2014-11-16 3 views
6

Obwohl ich C, C++ und C# seit vielen Jahren programmiert habe, bin ich nur oberflächlich mit Java vertraut. Er half meinem Comp Sci-Sohn mit einem Java-College-Projekt, Referenzen zu zwei Objekten von einer Methode in Java zurückzugeben. Ich schlug vor, einen als Funktionswert und den zweiten als Referenz zurückzugeben. Er war nicht sicher, wie er das machen sollte. Ich recherchierte ein wenig und erkannte, dass es vielleicht nicht möglich ist. Meine Frage ist in Java, was die übliche Methode ist, wenn eine Methode mehr als einen Verweis auf ein Objekt zurückgeben muss. Hier ist das spezifische Beispiel in meinem Sohn Fall.Wie man einen Verweis auf ein Objekt als Parameter in Java zurückgibt

// This method returns references to the head and tail objects from the passed in 
// linked list. The head object is returned as the function value and the tail is 
// returned as a parameter. 
public Static Node GetHeadTail(List list, Node tail) 

Ich weiß, die oben nicht in Java funktionieren, da der Schwanz ein Verweis auf Knoten und in Java die Referenz selbst von Wert übergeben wird. Was ist der gebräuchlichste Umgang mit Java? Die Lösung meines Sohnes bestand darin, ein Array von 2 Node-Objekten für den Funktionswert zurückzugeben. Ich sagte, das sei eine schlechte Lösung, weil es nicht die Bedeutung jedes Elements des Arrays dokumentiert. Eine andere Lösung wäre, ein Objekt zu erstellen, das die Kopf- und Endreferenzen enthält. In dem bestimmten Beispiel war es jedoch der Kopfzeiger, der am interessantesten war, und wenn ein Objekt zurückgegeben wurde, würde dies einen unerwünschten Codierungsaufwand für den Aufrufer der Methode erzeugen, wenn alles, was sie wollten, der Kopf war.

+0

Die gebräuchlichen Lösungen sind in der Tat, was Sie bereits wissen: a) Verkapseln Sie die Objekte, die in einem Objekt zurückgegeben werden, oder b) Geben Sie ein Array zurück. – shasan

+1

Müssen Sie wirklich die beiden in einem einzigen Anruf erhalten? Ich würde in den meisten Fällen nur zwei Methoden verwenden: 'getHead' und' getTail'. –

+0

Es gibt keine einfache Möglichkeit, eine Funktion zwei Objekte in Java zurückzugeben. Ich denke, die Lösung Ihres Sohnes ist in Ordnung, aber die Schaffung eines Objekts für sie kann in Abhängigkeit von der Situation in Ordnung sein. – wvdz

Antwort

2

In diesem Fall Java-Programmierer würde eine Klasse mit zwei Mitgliedern häufig erstellen: head und tail. Das wäre der Rückgabetyp für die getHeadTail(List list) Methode.

1

Sie können nur nach Wert in Java übergeben. Ihre beste Lösung ist die zweite, die Ihr Sohn vorgeschlagen hat, d. H. Ein Objekt zurückgeben, das Kopf und Schwanz hat.

1

Java ist immer "pass-by-value". Die schwierige Sache kann sein, zu verstehen, dass Java Objekte als Referenzen übergibt und diese Referenzen nach Wert übergeben werden. (Is Java "pass-by-reference" or "pass-by-value"?)

Allerdings sind Sie in der Lage, so etwas wie dies zu tun:

public static void main(String[] args) 
{ 
    Car c = new Car("Blue"); 
    System.out.println(c.getName()); 
    changer(c); 
    System.out.println(c.getName()); 
} 

public static void changer(Car c) 
{ 
    c.setName("Red"); 
} 

Die Car-Klasse.

public class Car 
{ 
    private String name; 

    public Car(String n) 
    { 
     name = n; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String n) 
    { 
     name = n; 
    } 
} 

wird der Ausgang sein:

Blue 
Red 

Mit diesem Wissen können Sie die head ändern, was tail Punkte und noch in der Lage zurückzukehren.

1

Java macht diese interessante Sache, die eine Art Hybrid zwischen Pass-by-Value und Pass-by-Reference ist. Grundsätzlich kann ein Parameter nicht durch die Funktion geändert werden, aber die Funktion kann den Parameter dazu auffordern, sich selbst zu ändern, indem er eine Methode in ihm aufruft. This answer does a pretty good job of explaining it.

Als Antwort auf "Was ist der gängigste Weg, damit in Java umzugehen?" Ihre Lösung zum Erstellen einer Klasse, die eine Kopf- und Endreferenz enthält, ist wahrscheinlich die gängigste und bewährte Methode. Wenn möglich, ist es sogar am besten, separate getHead- und getTail-Methoden zu verwenden.

1

Eine etwas weniger offensichtliche Lösung: Verwenden Sie einen der eingebauten Typen, wie Queue oder LinkedList, der bereits einen Kopf und einen Schwanz hat.

LinkedList list = new LinkedList(); 
head = list.getFirst(); 
tail = list.getLast(); 

Es gibt eine Reihe von Typen wie diese je nach Bedarf. Read the docs.

1

Eine etwas hacky Technik ist es, ein Array als Parameter zu verwenden. Dann kann die Funktion den Wert eines oder mehrerer Elemente ändern, um sie "zurückzugeben". Es ist nicht schön, aber erledigt die Arbeit und vermeidet die Notwendigkeit, spezielle Wrapper-Objekte für diesen Zweck zu erstellen.

Nur eine Randnotiz, Scala löst dieses Problem, indem Sie Tupel zurückgeben können.