С# ref и out в Java

Как мы знаем, оба языка являются передаваемыми при передаче параметров методам. Но С# поддерживает ключевые слова ref и out для передачи по ссылке примитивных типов. Я ищу те же ключевые слова и технику в Java?

Мое предположение заключается в использовании класса Integer вместо int в Java.

Любые предложения и примеры?

Ответ 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 разрешала множественные возвращаемые значения из метода. Но, честно говоря, я не слишком много путешествую по этому поводу. Я бы не дал почку для этой функции.:)

Ответ 2

Java не поддерживает эту функцию.

Ответ 3

Java не поддерживает передачу примитивных типов по ссылке.

Обтекание int как Integer не поможет, так как это неизменный тип (т.е. не может быть изменен после создания).

Ответ 4

Java не имеет этого встроенного. Integer не будет делать, потому что он неизменен. Вы не можете изменить его состояние.

Вам нужно будет создать свой собственный изменяемый класс-оболочку. Но это очень "опасно" и может привести к неожиданным результатам, поэтому старайтесь избегать этого.

Ответ 5

Единственный способ передать значение обратно - передать ссылку на изменяемое значение, например

public void calc(int[] value) { value[0] = 1; }
public void calc(AtomicInteger value) { value.set(1); }

однако самое простое - вернуть все измененные значения

public int calc() { return 1; }