Подтвердить что ты не робот

Java: лучший способ передать int по ссылке

У меня есть функция синтаксического анализа, которая анализирует закодированную длину из байтового буфера, возвращает синтаксическую длину как int и принимает индекс в буфер как целочисленный arg. Я хочу, чтобы функция обновляла индекс в соответствии с тем, что он разобрал, т.е. Хочет передать этот индекс по ссылке. В C я просто передаю int *. Какой самый чистый способ сделать это в Java? Я сейчас смотрю на передачу индекса arg. как int[], но это немного уродливо.

4b9b3361

Ответ 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

Надеюсь, что это поможет.