Есть какие-нибудь советы по обходу проблемы передачи по значению?

#java #parameters #parameter-passing #pass-by-reference #pass-by-value

#java #параметры #передача параметров #передача по ссылке #передача по значению

Вопрос:

В приведенном ниже коде у меня классическая проблема с передачей по значению Java (написана в processing; 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
}
 

У кого-нибудь есть какие-нибудь хитрые приемы, которые они используют, чтобы назначить новый объект ссылке, переданной в качестве параметра?

Я могу описать свое намерение, если это необходимо, но мне бы хотелось получить обобщенный ответ, если он существует.

РЕДАКТИРОВАТЬ: похоже, мне нужно описать свое намерение. Я использую составной шаблон для создания рекурсивной иерархии объектов. У меня есть объект вне этой иерархии, на который я хотел бы сослаться на один из объектов в иерархии. Я хотел бы передать этот объект через составной стиль цепочки ответственности, а затем сослаться на этот объект, какой бы объект ни взял на себя ответственность за это.

Я могу найти способ добиться этого, хотя я уверен, что возвращаю значения, но возможность присвоить параметр, который я передал по иерархии, была бы приятной, если бы был какой-нибудь простой способ сделать это.

Комментарии:

1. Возвращать значение вместо void ?

2. Создайте B в конструкторе A и назначьте его полю. Если вы по какой-то причине не можете этого сделать, создайте сеттер на A.

Ответ №1:

Вы можете попробовать вернуть объект B , который вы создаете в классе A 4

Показано ниже.

 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

Ответ №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
}