Java: 传递int的最佳引用方式

91
我有一个解析函数,从字节缓冲区中解析编码长度,并将解析的长度作为int返回,并以整数参数作为缓冲区的索引。我希望该函数根据其解析的结果更新索引,即想通过引用传递索引。在C语言中,我会使用指向int的指针来实现。 在Java中,最干净的方法是什么? 我目前正在考虑将索引参数作为int[]传递,但这有点丑陋。

14
Integer 是不可变的。 - Yuval Adam
1
如果你想避免使用Apache库,可以传递int并返回更新后的值。如果有两个值,我建议使用Point作为容器。否则,数组选项或其他建议中的一个都可以。 - EntangledLoops
你应该返回一个整数或对象;如果你真的需要多个,也许你应该重新考虑你的“类”设计。 - Ujjwal Singh
7个回答

74
你可以尝试使用Apache Commons库中的org.apache.commons.lang.mutable.MutableInt。在语言本身中没有直接的方法来实现这一点。

25

Java中不可能实现这一点。如你所提议的,一种方法是传递一个 int[]。另一种方法是使用一个小类来包装一个 int,例如 IntHolder


20
您可以使用 java.util.concurrent.atomic.AtomicInteger 类。

根据我的看法,使用AtomicInteger可能不是一个好主意,仅仅是因为我们想通过引用传递变量。这是一个位于并发包下的类型,这意味着该类应该在需要多个线程同时访问同一变量的情况下使用,在单线程访问情况下最好避免使用它,可以使用自定义的基本类型包装类来完成工作。 - Arjun Sharma
根据我的观点,使用AtomicInteger可能不是一个好主意,仅仅是因为我们想通过引用传递变量。AtomicInteger是并发包下的一种类型,意味着这个类应该在需要多个线程同时访问同一个变量的情况下使用,而在单线程访问的情况下最好避免使用它,可以使用自定义的包装类来完成工作。 - undefined

20

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

你可以将整型值封装在可变对象中。使用Apache Commons的MutableInt是一个不错的选择。另一种略微更加晦涩的方法是使用int[],就像你建议的那样。我不会使用它,因为不清楚为什么要把int包装在单元素数组中。

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


AtomicInteger的使用怎么样?它是可变的并且通过引用传递吗?(据我所知,AtomicReference<Boolean>可以正确地实现这一点)。 - icbytes

14

将字节缓冲区和索引封装到ByteBuffer对象中。 ByteBuffer封装了缓冲区+位置的概念,允许您从索引位置读取和写入数据,并在操作时更新其位置。


6
没错,不要强行按照自己的方式去编写Java代码,而是按照Java的方式来进行。Java不同于C语言。试图让它像C语言一样工作永远都是丑陋的hack(解决方案)。 - 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

希望这可以帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接