Почему передача объекта Command не работает? - PullRequest
0 голосов
/ 08 января 2012

Интересно, почему передача двухуровневого объекта Command из класса parent-child не будет работать.

Примерно так (класс A является родительским для B, а B является родительским для C):

Class A (Creates the instance of the Command object that is passed down to B)

+-- Class B ( Pass down the object to C) 


+------- Class C ( Callsthe execute() method of the Command object)

Принимая во внимание, когда экземпляр объекта Command создается в классе B и передается вниздля класса C это работает нормально.

Пример:

РЕДАКТИРОВАТЬ:

Пример (рукописный код):

public class A {
   private Command command;
   private B b;
   public A() {
     b = new B();
     command = new Command() {
          public void execute() {
            // Do something
          }
     }
     b.setCommand(command);
   }

public class B {
   private Command command;
   private C c;

   public B() {
     c = new C();
     c.setCommand(this.command);
   }

   public void setCommand(Command command){
       this.command = command; 
   }  

}


public class C {
   private Command command;
   public C() {

   }

   public void doStuff() {
       command.execute();
   }
   public void setCommand(Command command){
       this.command = command; 
   }        
}

Ответы [ 4 ]

2 голосов
/ 08 января 2012

Из вашего примера кода очевидно, что к тому времени, когда вы вызываете c.setCommand () (в конструкторе B), this.command еще не был обновлен с использованием экземпляра Command, переданного из A:

b = new B();
// here, c.setCommand() has already been called with b.command, which hasn't been initialized, so is 'null'
b.setCommand(command); // sets b.command, but doesn't change c.command's value, which is then still 'null'

Выполнение кода с помощью отладчика выявило бы источник ошибки за несколько секунд. Это Java 101.

1 голос
/ 08 января 2012

Является ли модификатор доступа объекта Command общедоступным?

0 голосов
/ 10 января 2012

О-о-о-о ... вам необходимо больше узнать о последовательности создания объектов.

  • Вы создали экземпляр объекта B.
  • Затем в рамках создания экземпляра объекта C вы назначаете объекту C объекткоманда объекта B.
  • Который в данный момент команда имеет значение null.
  • Тогда только вы присвоили объекту B команду, что слишком поздно, потому что вы должны были передать команду в конструкторB.

Класс A:

public class A {
   private B b;
   public A() {
     b = new B(
       new Command() {
         public void execute() {
           Window.alert("Gotcha");
         }
       }
     );
   }

Класс B:

public class B {
   private C c;

   public B(Command cmd) {
     c = new C();
     c.setCommand(cmd);
     c.doStuff();
   }
}

Класс C:

public class C {
  private Command command;
  public C() {
  }

  public void doStuff() {
    command.execute();
  }

  public void setCommand(Command command){
    this.command = command; 
  }        
}

Или почему?не это

public class B {
   private C c;

   public B(Command cmd) {
     c = new C(cmd).doStuff(1000);
   }
}

public class C {
  private Command command;
  public C(Command cmd) {
    this.command = cmd; 
  }

  public C doStuff(int i) {
    if (--i>0){
      new C(cmd).doStuff(i);
    }    
    command.execute();
    return this;
  }
}
0 голосов
/ 08 января 2012

Проблема заключалась в том, что в процессе передачи объект Command из класса A назначается локальному объекту Command класса B, то есть локальному объекту Command класса B отправляется класс C.

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