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

发布于 2024-09-11 14:24:07 字数 197 浏览 6 评论 0原文

我有一个解析函数,它从字节缓冲区解析编码长度,它以 int 形式返回解析后的长度,并将缓冲区中的索引作为整数参数。我希望该函数根据解析的内容更新索引,即希望通过引用传递该索引。在 C 中,我只需传递一个 int *。 在 Java 中执行此操作最干净的方法是什么? 我目前正在考虑传递索引参数。作为一个int[],但它有点难看。

I have a parsing function that parses an encoded length from a byte buffer, it returns the parsed length as an int, and takes an index into the buffer as an integer arg. I want the function to update the index according to what it's parsed, i.e. want to pass that index by reference. In C I'd just pass an int *.
What's the cleanest way to do this in Java?
I'm currently looking at passing the index arg. as an int[], but it's a bit ugly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

最冷一天 2024-09-18 14:24:07

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

You can try using org.apache.commons.lang.mutable.MutableInt from Apache Commons library. There is no direct way of doing this in the language itself.

那一片橙海, 2024-09-18 14:24:07

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

This isn't possible in Java. As you've suggested one way is to pass an int[]. Another would be do have a little class e.g. IntHolder that wrapped an int.

梓梦 2024-09-18 14:24:07

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

您可以做的是将整数值包装在可变对象中。使用 Apache Commons 的 MutableInt 是一个不错的选择。另一种稍微混乱的方法是像您建议的那样使用 int[] 。我不会使用它,因为不清楚为什么要将 int 包装在单单元数组中。

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

You cannot pass arguments by reference in Java.

What you can do is wrap your integer value in a mutable object. Using Apache Commons' MutableInt is a good option. Another, slightly more obfuscated way, is to use an int[] like you suggested. I wouldn't use it as it is unclear as to why you are wrapping an int in a single-celled array.

Note that java.lang.Integer is immutable.

你的背包 2024-09-18 14:24:07

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

You can use java.util.concurrent.atomic.AtomicInteger.

埋情葬爱 2024-09-18 14:24:07

将字节缓冲区和索引包装到 ByteBuffer 对象。 ByteBuffer 封装了缓冲区+位置的概念,并允许您从索引位置读取和写入,索引位置会随着您的操作而更新。

Wrap the byte buffer and index into a ByteBuffer object. A ByteBuffer encapsulates the concept of a buffer+position and allows you to read and write from the indexed position, which it updates as you go along.

软的没边 2024-09-18 14:24:07

您可以像这样设计新类:

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;

You can design new class like this:

public class Inte{
       public int x=0;
}

later you can create object of this class :

Inte inte=new Inte();

then you can pass inte as argument where you want to pass an integer variable:

public void function(Inte inte) {
some code
}

so for update the integer value:

inte.x=value;

for getting value:

Variable=inte.x;
无远思近则忧 2024-09-18 14:24:07

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

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

然后您可以创建将 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;
    }
}

用法:

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

希望这会有所帮助。

You can create a Reference class to wrap primitives:

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

Then you can create functions that take a Reference as a parameters:

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;
    }
}

Usage:

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

Hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文