Java:通过引用传递int的最佳方法


84

我有一个解析函数,该函数解析字节缓冲区中的编码长度,它以int形式返回解析后的长度,并以整数arg形式进入缓冲区。我希望函数根据解析的内容来更新索引,即要通过引用传递该索引。在C语言中,我会通过一个int *。用Java做到这一点最干净的方法是什么?我目前正在查看传递索引arg。作为int[],但有点难看。


13
Integer是一成不变的。
Yuval Adam

1
如果要避免使用apache库,则可以传递int并返回更新后的值。如果是两个值,建议将Point用作容器。否则,可以使用数组选项或此处​​的其他建议之一。
EntangledLoops 2015年

您应该返回一个int或一个对象;如果您确实需要多个,也许您应该重新考虑您的“班级”设计
Ujjwal Singh

Answers:


72

您可以尝试org.apache.commons.lang.mutable.MutableInt从Apache Commons库使用。语言本身没有直接的方法可以做到这一点。


24

这在Java中是不可能的。正如您所建议的,一种方法是传递int[]。另一个将是有一个小类,例如IntHolder包装一个int


20

您不能在Java中通过引用传递参数。

您可以将整数值包装在一个可变对象中。使用Apache CommonsMutableInt是一个不错的选择。另一种稍微模糊的方式是使用int[]您建议的方式。我不会使用它,因为不清楚为什么要int在单单元数组中包装。

注意这java.lang.Integer是不可变的。


AtomicInteger的用法如何?这是可变的并通过引用传递吗?(Afaik AtomicReference <Boolean>可以正确执行此操作)。
icbytes 2014年

18

您可以使用java.util.concurrent.atomic.AtomicInteger


14

包装字节缓冲区并将其索引到ByteBuffer对象中。ByteBuffer封装了buffer + position的概念,并允许您从索引位置进行读取和写入,该位置随着您的前进而更新。


6
究竟。不要强迫Java按自己的方式做,而是按Java的方式做。Java不是C。试图使其像C一样行为总是丑陋的。
跳过头

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

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.