如何在Java中模拟引用传递?

Cas*_*ton 9 java pass-by-reference

我是一个完整的Java菜鸟.我知道Java将所有参数视为按值传递,并且还有其他一些线程可供人们解释.

例如,在C++中我可以这样做:

void makeAThree(int &n)
{
   n = 3;
}
int main()
{
   int myInt = 4;
   makeAThree(myInt);
   cout << myInt;
}
Run Code Online (Sandbox Code Playgroud)

哪个将输出3.我知道在Java中,所有参数都是按值传递的,因此您无法操纵传入的参数.是否有一种标准的方法来模拟 Java中的引用传递?有没有办法调用一个操作传入的变量的函数?我很难理解无法做到这一点的想法.

Mar*_*ers 15

模拟传递引用的主要方法是传递保存该值的容器.

static void makeAThree(Reference<Integer> ref)
{
   ref.set(3);
}

public static void main(String[] args)
{
  Reference<Integer> myInt = new Reference<>(4);
  makeAThree(myInt);
  System.out.println(myInt.get());
}
Run Code Online (Sandbox Code Playgroud)

由于在Java中,它引用到由值(对象本身是从来没有在全部通过)传递的对象,设置ref3makeAThree变化相同的对象提到了myIntmain().

免责声明:Reference不是一个可以与开箱即用的Java一起使用的类.我在这里使用它作为任何其他对象类型的占位符.这是一个非常简单的实现:

public class Reference<T> {
    private T referent;

    public Reference(T initialValue) {
       referent = initialValue;
    }

    public void set(T newVal) {
       referent = newVal;
    }

    public T get() {
       return referent;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

这并不是说修改方法的参数是很好的做法.通常这会被视为副作用.通常,最佳做法是将方法的输出限制为返回值this(如果方法是实例方法).修改参数是一种非常"C"的方法来设计方法,并且不能很好地映射到面向对象的编程.

  • “修改参数是设计方法的一种非常“C”的方式,不能很好地映射到面向对象的编程。” 我认为它与 OOP 完全正交,并且在许多情况下,它可以是给定问题的最佳设计解决方案。 (2认同)

RAY*_*RAY 7

您可以使用大小为1的数组