关于解决按价值传递问题的任何提示?

Any tips on getting around the pass-by-value issue?

提问人:Dukkha 提问时间:12/13/2020 最后编辑:Mark RotteveelDukkha 更新时间:12/13/2020 访问量:46

问:

在下面的代码中,我有一个经典的 Java 按值传递问题(用处理编写; setup() == main)。

void setup()
{
  A a = new A();
  
  a.makeTheB(a.b);
  System.out.println(a.b); //Returns null
}

class A
{
  B b;
  
  public void makeTheB(B tempB)
  {
    tempB = new B();
  }
}

class B
{
  float x; //not used
}

有人有什么聪明的技巧来将新对象分配给作为参数传递的引用吗?

如果需要,我可以描述我的意图,但如果存在的话,我希望有一个笼统的答案。

编辑:看起来我需要描述我的意图。 我正在使用复合模式来创建对象的递归层次结构。我在该层次结构之外有一个对象,我想引用层次结构中的一个对象。我想通过复合责任链样式传递该对象,然后让该对象引用负责它的对象。

我敢肯定,我可以通过返回值找到一种方法来实现这一点,但是如果有任何切肉刀方法可以做到这一点,那么能够分配我传递到层次结构中的参数肯定会很好。

java 参数 参数传递 引用

评论

2赞 markspace 12/13/2020
返回一个值而不是 ?void
0赞 tgdavies 12/13/2020
在 A 构造函数中创建 B,并将其分配给字段。如果由于某种原因无法做到这一点,请在 A 上创建一个 setter。

答:

1赞 Lakindu Hewawasam 12/13/2020 #1

您可以尝试返回您在类 4 中创建的对象BA

如下图所示。

public class A {

    B b;

    public B makeTheB(B tempB) {
        tempB = new B();
        return tempB;
    }
}

public class B {
    float x; //not used
}

public class Test {

    public static void main(String[] args) {
        A a = new A();

        B b = a.makeTheB(a.b);
        System.out.println(b); //Returns nu
        
        
    }
}

输出:B@7852e922

1赞 tgdavies 12/13/2020 #2

你可以这样做,但也许你需要更好地描述你想要实现的目标。

void setup()
{
  A a = new A();
  
  a.makeTheB(a);
  System.out.println(a.b);
}

class A implements Consumer<B>
{
  B b;

  public void accept(B b) {
    this.b = b;
  }
  
 /**
  * Create a B, and give it to a Consumer which knows where it needs to be stored.
  */
  public void makeTheB(Consumer<B> consumer)
  {
    consumer.accept(new B());
  }
}

class B
{
  float x; //not used
}