Как передать примитивный тип данных по ссылке?
Как я могу передать примитивный тип по ссылке в 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.ленг.Integer, тогда вы вообще не передаете примитив.
С другой стороны, вы можете просто использовать следующий код:
int a = 5;
a = func(a);
и func возвращает измененное значение.