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

fre*_*set 79 java pass-by-reference

我有一个解析函数,它解析来自字节缓冲区的编码长度,它将解析的长度作为int返回,并将索引作为整数arg作为缓冲区.我希望函数根据它的解析来更新索引,即希望通过引用传递该索引.在C我只是通过int *.在Java中最干净的方法是什么?我目前正在考虑传递索引arg.作为一个int[],但它有点难看.

dou*_*lep 71

您可以尝试使用org.apache.commons.lang.mutable.MutableIntApache Commons库.在语言本身没有直接的方法.


mik*_*kej 20

这在Java中是不可能的.正如你所建议的那样,一种方法是通过int[].另一个会有一个小班,例如IntHolder包裹一个int.


Yuv*_*dam 16

您不能通过Java中的引用传递参数.

你可以做的是将整数值包装在一个可变对象中.使用Apache Commons' MutableInt是一个不错的选择.另一种稍微混淆的方式是使用int[]你建议的方式.我不会使用它,因为目前还不清楚为什么要包装int一个单细胞阵列.

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


use*_*377 14

你可以用java.util.concurrent.atomic.AtomicInteger.


Joh*_*ica 13

将字节缓冲区和索引包装到ByteBuffer对象中.ByteBuffer封装了缓冲区+位置的概念,允许您从索引位置读取和写入,随着时间的推移,它会更新.

  • 究竟.不要强迫Java以你的方式去做,用Java方式做.Java不是C.试图让它像C一样行事总是丑陋的黑客. (6认同)

Ano*_* Sb 8

你可以设计这样的新类:

public class Inte{
       public int x=0;
}
Run Code Online (Sandbox Code Playgroud)

以后你可以创建这个类的对象:

Inte inte=new Inte();
Run Code Online (Sandbox Code Playgroud)

然后你可以传递inte你想要传递整数变量的参数:

public void function(Inte inte) {
some code
}
Run Code Online (Sandbox Code Playgroud)

所以更新整数值:

inte.x=value;
Run Code Online (Sandbox Code Playgroud)

获得价值:

Variable=inte.x;
Run Code Online (Sandbox Code Playgroud)


Mic*_*ron 5

您可以创建一个Reference类来包装基元:

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以创建将Reference作为参数的函数:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.