У меня есть функция синтаксического анализа, которая анализирует закодированную длину из байтового буфера, возвращает синтаксическую длину как int и принимает индекс в буфер как целочисленный arg. Я хочу, чтобы функция обновляла индекс в соответствии с тем, что он разобрал, т.е. Хочет передать этот индекс по ссылке. В C я просто передаю int *
.
Какой самый чистый способ сделать это в Java?
Я сейчас смотрю на передачу индекса arg. как int[]
, но это немного уродливо.
Java: лучший способ передать int по ссылке
Ответ 1
Вы можете попробовать использовать org.apache.commons.lang.mutable.MutableInt
из библиотеки Apache Commons. Нет прямого способа сделать это в самом языке.
Ответ 2
Это невозможно в Java. Как вы предположили, один из способов - передать int[]
. У другого может быть небольшой класс, например. IntHolder
, который завернул int
.
Ответ 3
Вы не можете передавать аргументы по ссылке в Java.
Что вы можете сделать, это обернуть целочисленное значение в изменяемый объект. Использование Apache Commons MutableInt
- хороший вариант. Другой, немного более запутанный способ - использовать int[]
, как вы предложили. Я бы не использовал его, так как неясно, почему вы обертываете int
в одноядерном массиве.
Обратите внимание, что java.lang.Integer
является неизменным.
Ответ 4
Оберните буфер и индекс байта в объект ByteBuffer. ByteBuffer инкапсулирует концепцию позиции buffer + и позволяет вам читать и писать из индексированной позиции, которую она обновляет по мере продвижения.
Ответ 5
Вы можете использовать java.util.concurrent.atomic.AtomicInteger
.
Ответ 6
Вы можете создать новый класс следующим образом:
public class Inte{
public int x=0;
}
позже вы можете создать объект этого класса:
Inte inte=new Inte();
то вы можете передать inte
в качестве аргумента, где вы хотите передать целочисленную переменную:
public void function(Inte inte) {
some code
}
поэтому для обновления целочисленного значения:
inte.x=value;
для получения значения:
Variable=inte.x;
Ответ 7
Вы можете создать класс Reference для переноса примитивов:
public class Ref<T>
{
public T Value;
public Ref(T value)
{
Value = value;
}
}
Затем вы можете создавать функции, которые принимают ссылку как параметры:
public class Utils
{
public static void Swap<T>(Ref<T> v1, Ref<T> v2)
{
T temp = t1.Value;
t1.Value = t2.Value;
t2.Value = temp;
}
}
Использование:
Ref<Integer> x = 2;
Ref<Integer> y = 9;
Utils.Swap(x, y);
System.out.println("x is now equal to " + x.Value + " and y is now equal to " + y.Value";
// Will print: x is now equal to 9 and y is now equal to 2
Надеюсь, что это поможет.