【问题标题】:Java : Best way to pass int by referenceJava:通过引用传递 int 的最佳方式
【发布时间】:2011-03-20 13:26:19
【问题描述】:

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

【问题讨论】:

  • Integer 是不可变的。
  • 如果想避开apache库,可以传入int,返回更新后的值。如果是两个值,我建议使用 Point 作为容器。否则,数组选项或此处​​的其他建议之一很好。
  • 你应该返回一个 int 或一个对象;如果你真的需要不止一个,也许你应该重新考虑你的“类”设计

标签: java pass-by-reference


【解决方案1】:

您可以创建一个引用类来包装原语:

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以像这样设计新的类:

      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;
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 没错。不要强迫 Java 以你的方式去做,以 Java 的方式去做。 Java 不是 C。试图让它表现得像 C 一样总是丑陋的 hack。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

          • AtomicInteger 的用法呢?这是可变的并通过引用传递吗? (Afaik AtomicReference 正确地做到了这一点)。
          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2016-02-02
            • 1970-01-01
            • 2012-04-14
            • 2014-10-14
            • 1970-01-01
            • 2020-09-24
            • 2011-05-18
            • 2012-06-08
            • 2012-03-13
            相关资源
            最近更新 更多