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