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


84

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


13
Integerнеизменен.
Yuval Adam

1
Если вы хотите избежать использования библиотеки apache, вы можете передать int и вернуть обновленное значение. Если это два значения, я рекомендую использовать Point в качестве контейнера. В противном случае вариант с массивом или одно из других предложений здесь подойдет.
EntangledLoops

Вы должны возвращать int или объект; Если вам действительно нужно больше одного, возможно, вам следует переосмыслить дизайн своих «классов»
Уджвал Сингх

Ответы:


72

Вы можете попробовать использовать org.apache.commons.lang.mutable.MutableIntиз библиотеки Apache Commons. В самом языке нет прямого способа сделать это.


24

В Java это невозможно. Как вы предложили, один из способов - передать int[]. Другой был бы иметь небольшой класс, например, IntHolderкоторый обернул int.


20

В Java нельзя передавать аргументы по ссылке.

Вы можете заключить целочисленное значение в изменяемый объект. Использование Apache Commons MutableInt- хороший вариант. Другой, немного более запутанный способ - использовать предложенный int[]вами вариант . Я бы не стал его использовать, так как непонятно, зачем вы упаковываетеint в одноклеточный массив.

Обратите внимание, что java.lang.Integerэто неизменяемо.


А как насчет использования AtomicInteger? Это изменчиво и передается по ссылке? (Afaik AtomicReference <Boolean> делает это правильно).
icbytes


14

Оберните байтовый буфер и индекс в объект ByteBuffer . ByteBuffer инкапсулирует концепцию буфера + позиции и позволяет вам читать и писать из индексированной позиции, которую он обновляет по мере продвижения.


6
Точно. Не заставляйте Java делать это по-своему, делайте это по-Java. Java - это не C. Попытки заставить его вести себя так, как C, всегда будут уродливыми взломами.
Skip Head

9

Вы можете создать новый класс следующим образом:

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;

8

Вы можете создать ссылочный класс для обертывания примитивов:

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

Затем вы можете создавать функции, которые принимают ссылку в качестве параметров:

public class Utils
{
    public static <T> void Swap(Ref<T> t1, Ref<T> t2)
    {
        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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.