Ответ 1
Ваша догадка правильная. Требуется оболочка (но не целое, поскольку она неизменна).
Некоторые люди используют для этой цели массивы с одним элементом:
int[] x = { 0 };
int[] y = { 0 };
someMethod(x, y);
return x[0] + y[0];
Многие будут оценивать эту технику прямо там с помощью GOTO.
Некоторые люди определяют общий класс владельца:
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();
Некоторые определяют целевой тип:
SomeMethodResult result = someMethod(x, y);
return result.getX() + result.getY();
Некоторые из них договорились о том, что работа должна быть выполнена внутри метода, в первую очередь избегая необходимости в аргументах ссылки:
return someMethod(x, y);
Каждый из этих методов имеет свои преимущества и недостатки:
- массивы: простые и уродливые, полагаются на массив, имеющий ровно один элемент
- держатель: безопасный против verbose, бокс
- Целеустремленный тип: безопасный против verbose, возможный overkill
- метод изменения: безопасный, чистый и не всегда возможно
Лично я думаю, что Java испортил это. Я бы предпочел избежать аргументов by-reference, но я хочу, чтобы Java разрешала множественные возвращаемые значения из метода. Но, честно говоря, я не слишком много путешествую по этому поводу. Я бы не дал почку для этой функции.:)