2014-11-16 9 views
6

Anche se ho programmato C, C++ e C# per molti anni, sono solo superficialmente familiare con Java. Aiutando il mio figlio Comp Sci con un progetto di un college Java, aveva bisogno di restituire riferimenti a due oggetti da un metodo in Java. Ho suggerito di restituirne uno come valore della funzione e il 2 come riferimento. Non era sicuro di come farlo. Ho fatto una piccola ricerca e ho capito che potrebbe non essere possibile. La mia domanda è in Java qual è il metodo comune utilizzato quando un metodo deve restituire più di un riferimento a un oggetto. Ecco l'esempio specifico nel caso dei miei figli.Come restituire il riferimento all'oggetto come parametro in Java

// 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) 

io realizzare la sopra non funziona in Java poiché la coda è un riferimento al nodo in Java riferimento stesso viene passato per valore. Qual è il modo più comune di trattare questo in Java? La soluzione di mio figlio era di restituire un array di 2 oggetti Node per il valore della funzione. Ho detto che era una soluzione scadente perché non documenta il significato di ogni elemento dell'array. Un'altra soluzione sarebbe quella di creare un oggetto che contenesse i riferimenti di testa e coda. Tuttavia, nell'esempio in particolare, era il puntatore principale che era di maggiore interesse e se veniva restituito un oggetto, creava un codice di overhead indesiderato per il chiamante del metodo se tutto quello che desideravano era la testa.

+0

Le soluzioni comuni sono in effetti ciò che già sapete: a) Incapsulare gli oggetti da restituire in un oggetto o b) Restituire un array. – shasan

+1

Hai davvero bisogno di ottenere i due in una singola chiamata? Vorrei solo usare due metodi qui nella maggior parte dei casi: 'getHead' e' getTail'. –

+0

Non c'è un modo semplice per avere una funzione restituire due oggetti in Java. Penso che la soluzione di tuo figlio stia bene, ma creare un oggetto può andar bene, a seconda della situazione. – wvdz

risposta

2

In questo caso, i programmatori java creerebbero comunemente una classe con 2 membri: head e tail. Questo sarebbe il tipo di ritorno per il metodo getHeadTail(List list).

1

È possibile passare solo in base al valore in Java. La soluzione migliore è la seconda suggerita da tuo figlio, cioè restituire un oggetto che ha la testa e la coda.

1

Java è sempre pass-by-value. La cosa difficile può essere comprendere che Java passa oggetti come riferimenti e tali riferimenti vengono passati in base al valore. (Is Java "pass-by-reference" or "pass-by-value"?)

Tuttavia, sono in grado di fare qualcosa di simile:

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

La classe Car.

public class Car 
{ 
    private String name; 

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

    public String getName() 
    { 
     return name; 
    } 

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

L'uscita sarà:

Blue 
Red 

Sapendo questo, si sarà in grado di cambiare ciò che tail punti ed essere ancora in grado di restituire il head.

1

Java fa questa cosa interessante che è una sorta di ibrido tra pass-by-value e pass-by-reference. Fondamentalmente, un parametro non può essere modificato dalla funzione, ma la funzione può chiedere al parametro di cambiare se stesso chiamando un metodo all'interno di esso. This answer does a pretty good job of explaining it.

In risposta a "Qual è il modo più comune di gestire questo in Java?" la tua soluzione per creare una classe che contiene un riferimento di testa e coda è probabilmente la pratica più comune e migliore. Se possibile, potrebbe anche essere meglio avere solo metodi getHead e getTail separati.

1

Una soluzione leggermente meno ovvia: utilizzare uno dei tipi predefiniti, come Queue o LinkedList, che ha già una testa e una coda.

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

C'è un sacco di tipi come questo a seconda delle esigenze. Read the docs.

1

Una tecnica un po 'hacky consiste nell'utilizzare un array come parametro. Quindi, la funzione può cambiare il valore di uno o più elementi per "restituirli". Non è bello ma svolge il lavoro ed evita la necessità di creare oggetti wrapper speciali per questo scopo.

Proprio come una nota a margine, Scala risolve questo problema consentendo di restituire le tuple.

Problemi correlati