tua ipotesi è corretta. È necessario un wrapper (ma non intero poiché è immutabile).
Alcune persone usano array di elementi singoli per questo scopo:
int[] x = { 0 };
int[] y = { 0 };
someMethod(x, y);
return x[0] + y[0];
Molti saranno rango che la tecnica proprio lì con GOTO.
Alcune persone definiscono una classe di supporto generico:
public class Holder<T> {
private T _value;
private Holder(T value) { _value = value; }
public static of(T value) { return new Holder<T>(value); }
public T getValue() { return _value; }
public void setValue(T value) { _value = value; }
}
...
Holder<String> x = Holder.of("123");
Holder<String> y = Holder.of("456");
someMethod(x, y);
return x.getValue() + y.getValue();
Alcuni definiscono un tipo appositamente costruito:
SomeMethodResult result = someMethod(x, y);
return result.getX() + result.getY();
Alcuni potrebbero organizzare il lavoro da fare all'interno del metodo, evitando la necessità per argomenti di riferimento in primo luogo:
return someMethod(x, y);
Ognuna di queste tecniche s ha vantaggi e svantaggi:
- matrici: semplice vs.brutto, si basa su array di avere esattamente un elemento
- titolare: sicuro contro verbose, boxe
- appositamente costruito Tipo: sicuro contro verbose, possibile eccessivo
- metodo di modifica: sicuro, pulito vs non sempre è possibile
Personalmente, penso che Java abbia incasinato questo. Preferisco evitare gli argomenti di riferimento, ma vorrei che Java permettesse più valori di ritorno da un metodo. Ma, sinceramente, non inciampo su questo molto spesso. Non darei un rene per questa funzione. :)
Mi piace la tecnica di 'int []'. L'ho provato e ha funzionato bene. Grazie. – Tarik
+1 Risposta completa e sono praticamente d'accordo con l'ultimo paragrafo. – BoltClock
IMO 'int []' è brutto ma non vicino a "' goto' -level ". È hackerare la mancanza di una funzionalità linguistica (reale pass-by-reference) nel modo più semplice, il che rende praticamente la stessa cosa di "passare per puntatore" in C. Non ne abbiamo bisogno come spesso in Java come in C, ma fondamentalmente è solo per il modo in cui i due linguaggi si occupano della gestione della memoria e, a livello più concettuale, della "gestione degli oggetti". –