2010-07-24 2 views
67

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

+11

'Integer' является неизменным. –

+0

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

+0

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

ответ

67

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

13

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

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

Отметьте, что java.lang.Integer является неизменным.

+0

Как насчет использования AtomicInteger? Является ли это изменчивым и передается через ссылку? (Afaik AtomicReference делает это правильно). – icbytes

+1

Да icbytes. AtomicInteger - хороший вариант. – Prasath

19

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

13

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

+6

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

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

Вы можете использовать java.util.concurrent.atomic.AtomicInteger.

2

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

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 

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

Смежные вопросы