Как передать примитивный тип данных по ссылке?

Как я могу передать примитивный тип по ссылке в java? Например, как сделать int передано методу, изменяемому?

8 ответов


нет способа передать примитив непосредственно по ссылке в Java.

обходным путем является передача ссылки на экземпляр класса-оболочки, который затем содержит примитив в качестве поля-члена. Такой класс-обертка может быть чрезвычайно простым, чтобы написать для себя:

public class IntRef { public int value; }

но как насчет некоторых предварительно построенных классов-оболочек, поэтому нам не нужно писать свои собственные? OK:

Апач commons-lang Мутабельный* классы:
преимущества: хорошая производительность для однопоточного использования. Полнота.
недостатки: вводит зависимость от библиотеки сторонних производителей. Нет встроенных элементов управления параллелизмом.
представителя классы: MutableBoolean, MutableByte, MutableDouble, MutableFloat, MutableInt, MutableLong, MutableObject, MutableShort.

The java.утиль.параллельный.атомный атомная* урок:
преимущества: часть стандартного API Java (1.5+). Встроенные элементы управления параллелизмом.
недостатки: небольшое падение производительности при использовании в однопоточной установкой. Отсутствует прямая поддержка некоторых типов данных, например, отсутствует AtomicShort.
представитель классы: AtomicBoolean, AtomicInteger, AtomicLong и метод atomicreference.
Примечание: как пользователь ColinD показывает в своем ответе, AtomicReference можно использовать для аппроксимации некоторых отсутствующих классов, например AtomicShort.

длина 1 примитивный массив
OscarRyz это демонстрирует использование массива длины 1 для" обертывания " примитива значение.
преимущества: быстро писать. Производительным. Нет необходимости в сторонней библиотеке.
недостатки: немного грязный. Нет встроенных элементов управления параллелизмом. Результаты в коде, который не (явно) самостоятельного документа: массив в сигнатуре метода нет, поэтому я могу передать несколько значений? Или это здесь как леса для эмуляции pass-by-reference?

см. Также
Ответы на вопрос StackOverflow "изменяемое логическое поле в Java".

Мое Мнение
В Java, вы должны стремиться использовать вышеуказанные подходы экономно или нет вообще. В C обычно используется возвращаемое значение функции для ретрансляции кода состояния (успех/сбой), в то время как фактический выход функции ретранслируется через один или несколько out-параметров. В Java лучше использовать исключения вместо кодов возврата. Это освобождает возвращаемые значения метода, которые будут использоваться для переноса фактического метода output -- шаблон проектирования, который большинство программистов Java считают более естественным, чем out-параметры.


ничто в java не передается по ссылке. Все передается по стоимости.

Edit: оба примитивы и типы объектов передаются по значению. Вы никогда не можете изменить переданное значение/ссылку и ожидать изменения исходного значения/ссылки. Пример:

String a;
int b;

doSomething(a, b);

...

public void doSomething(String myA, int myB) {
   // whatever I do to "myA" and "myB" here will never ever ever change
   // the "a" and "b"
}

единственный способ обойти это препятствие, независимо от его примитивности или ссылки, - передать объект контейнера или использовать возвращаемое значение.

С a держатель:

private class MyStringHolder {
  String a;
  MyStringHolder(String a) {
    this.a = a;
  }
}

MyStringHolder holdA = new MyStringHolder("something");

public void doSomething(MyStringHolder holder) {
   // alter holder.a here and it changes.
}

С возвращаемым значением

int b = 42;
b = doSomething(b);

public int doSomething(int b) {
  return b + 1;
}

передать AtomicInteger, AtomicBoolean, etc. вместо. Нет одного для каждого примитивного типа, но вы можете использовать, скажем,AtomicReference<Short> при необходимости тоже.

обратите внимание: в Java очень редко нужно делать что-то подобное. Когда вы хотите это сделать, я бы рекомендовал переосмыслить то, что вы пытаетесь сделать, и посмотреть, не можете ли вы сделать это каким-то другим способом (используя метод, который возвращает int, скажем... что именно лучше всего сделать, будет варьироваться от ситуации к ситуации).


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

void demo() { 
    int [] a = { 0 };
    increment ( a ) 
}
void increment( int [] v ) { 
     v[0]++;
}

но всегда есть лучшие варианты.


вы не можете. Но вы можете возвращать целое число, которое является измененным значением

int i = 0;
i = doSomething(i);

Если вы передаете более одного, вы можете создать Объект Передачи Данных (класс, специально содержащий набор переменных, которые могут быть переданы классам).


передать объект, который имеет это значение в поле.


Это невозможно в Java


один из вариантов-использовать классы, такие как java.ленг.Integer, тогда вы вообще не передаете примитив.

С другой стороны, вы можете просто использовать следующий код:

int a = 5;
a = func(a);

и func возвращает измененное значение.