2016-02-06 2 views
1

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

private Subject carMonitor; 

public AdvancedMonitor(Subject ... carMonitors){ 
    for (Subject carMonitor : carMonitors){ 
    this.carMonitor = carMonitor; 
    carMonitor.registerObserver(this); 
    } 
} 

Однако, когда я пытаюсь вызвать его в мой основной метод, я не могу использовать ничего, кроме одного аргумента:

BigCar bigCar = new BigCar(); 
    SmallCar smallCar = new SmallCar(); 
    AdvancedMonitor doubleAdvancedDisplay1 = new AdvancedMonitor(); 
    AdvancedMonitor doubleAdvancedDisplay2 = new AdvancedMonitor(bigCar); 
    AdvancedMonitor doubleAdvancedDisplay3 = new AdvancedMonitor(bigCar, smallCar); 

Только второй работает. Почему это?

enter image description here

Это связано с моим интерфейсом?

public interface Subject { 
    public void registerObserver(Observer o); 
    public void removeObserver(Observer o); 
    public void notifyObservers(); 
} 

большой интерфейс автомобиля - маленький автомобиль в значительной степени то же самое сейчас:

public class BigCar implements Subject { 
    private ArrayList observers; 
    private int state; 

    public BigCar(){ 
     observers = new ArrayList(); 
    } 

    public void registerObserver(Observer o){ 
     observers.add(o); 
    } 

    public void removeObserver(Observer o){ 
     int i = observers.indexOf(o); 
     if (i >= 0){ 
      observers.remove(i); 
     } 
    } 

    public void notifyObservers(){ 
     for (int i = 0; i < observers.size(); i++){ 
      Observer observer = (Observer)observers.get(i); 
      observer.update(state); 
     } 
    } 

    public void stateChanged() { 
     notifyObservers(); 
    } 

    public void setState(int state){ 
     this.state = state; 
     stateChanged(); 
    } 
} 
+1

Когда вы говорите, «Только второй один работает», что именно вы имеете в виду? Вы получаете исключение компиляции для других 2? Исключение времени выполнения? – radoh

+1

"this.carMonitor = carMonitor", подозрительное изменение состояния здесь –

+0

@radoh Я получаю предупреждение от NetBeans: 'required: Subject found: no arguments reason: фактические и формальные списки аргументов различаются по длине' – user25976

ответ

1

я пишу следующий код:

public class Test { 
    public static class AdvancedMonitor { 
     private String carMonitor; 

     public AdvancedMonitor(String... carMonitors) { 
      for (String carMonitor : carMonitors) { 
       this.carMonitor = carMonitor; 
       System.out.println(this.carMonitor); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     String bigCar = "bigCar"; 
     String smallCar = "smallCar"; 
     System.out.println("step 1"); 
     AdvancedMonitor doubleAdvancedDisplay1 = new AdvancedMonitor(); 
     System.out.println(); 
     System.out.println("step 2"); 
     AdvancedMonitor doubleAdvancedDisplay2 = new AdvancedMonitor(bigCar); 
     System.out.println(); 
     System.out.println("step 3"); 
     AdvancedMonitor doubleAdvancedDisplay3 = new AdvancedMonitor(bigCar, smallCar); 
    } 
} 

И я следующий результат:

step 1 

step 2 
bigCar 

step 3 
bigCar 
smallCar 

На мой взгляд, все правильно , Что не так в вашем случае? Вы используете logging или System.out.println для отладки вашей проблемы? Это похоже на вашу проблему не с Java varagrs, но у вас есть какое-то исключение в carMonitor.registerObserver(this).

P.S. Кроме того, вы понимаете, что каждый AdvancedMonitor имеет только один varible carMonitor? И используя new AdvancedMonitor(bigCar, smallCar); в результате у вас есть AdvancedMonitor только с smallCar в private String carMonitor;?

P.P.S. Также неплохая идея использовать this в construstor, потому что объект не создается при запуске construstor.

+0

Совершенно прекрасно использовать 'this' в конструкторе, чтобы отличать имя поля от имени аргумента. –

0

Фактически Конструктор работает.

Пожалуйста, проверьте эти заявления:
SmallCar и BigCar и реализует Subject
класс AdvancedMonitor реализует Observer
AdvancedMonitor doubleAdvancedDisplay не декларируется несколько раз, но в вашем коде есть. Это должно быть как-л:

AdvancedMonitor doubleAdvancedDisplay1 = new AdvancedMonitor(); 
AdvancedMonitor doubleAdvancedDisplay2 = new AdvancedMonitor(bigCar); 
AdvancedMonitor doubleAdvancedDisplay3 = new AdvancedMonitor(bigCar, smallCar); 

Я надеюсь, что это поможет вам

Смежные вопросы