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