У меня есть функция синтаксического анализа, которая анализирует закодированную длину из байтового буфера, она возвращает проанализированную длину как int и принимает индекс в буфер как целое число arg. Я хочу, чтобы функция обновляла индекс в соответствии с тем, что он анализирует, т.е. хочу передать этот индекс по ссылке. В C я бы просто передал int *
. Какой самый чистый способ сделать это на Java? В настоящее время я ищу возможность передать аргумент индекса. как int[]
, но это немного некрасиво.
java
pass-by-reference
Фред Бассет
источник
источник
Integer
неизменен.Ответы:
Вы можете попробовать использовать
org.apache.commons.lang.mutable.MutableInt
из библиотеки Apache Commons. В самом языке нет прямого способа сделать это.источник
В Java это невозможно. Как вы предложили, один из способов - передать
int[]
. Другой был бы иметь небольшой класс, например,IntHolder
который обернулint
.источник
В Java нельзя передавать аргументы по ссылке.
Вы можете заключить целочисленное значение в изменяемый объект. Использование Apache Commons
MutableInt
- хороший вариант. Другой, немного более запутанный способ - использовать предложенныйint[]
вами вариант . Я бы не стал его использовать, так как непонятно, зачем вы упаковываетеint
в одноклеточный массив.Обратите внимание, что
java.lang.Integer
это неизменяемо.источник
Вы можете использовать
java.util.concurrent.atomic.AtomicInteger
.источник
Оберните байтовый буфер и индекс в объект ByteBuffer . ByteBuffer инкапсулирует концепцию буфера + позиции и позволяет вам читать и писать из индексированной позиции, которую он обновляет по мере продвижения.
источник
Вы можете создать новый класс следующим образом:
public class Inte{ public int x=0; }
позже вы можете создать объект этого класса:
Inte inte=new Inte();
тогда вы можете передать в
inte
качестве аргумента целочисленную переменную:public void function(Inte inte) { some code }
поэтому для обновления целочисленного значения:
для получения значения:
источник
Вы можете создать ссылочный класс для обертывания примитивов:
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
Надеюсь это поможет.
источник