allgemein
objekt-orientierter entwurf
programmierung
qualitätssicherung / testen

Programiersprache  Java 
Schwierigkeitsgrad  mittel 
Eingereicht von  Sascha Frick 
Veröffentlicht am  27.02.2005  
Lösung veröffentlicht am   07.03.2005 

Der bugTeaser

public void clear() {
  lock();    
  notifyBeforeClear();
  removeElements();
  notifyAfterClear();
  unlock();
}

private void notifyBeforeClear() {
  notify(new IAction() {
    public void execute(IElementListener listener) {
      listener.beforeClear(this); 
    }      
  });
}

private  void notifyAfterClear() {
  notify(new IAction() {
    public void execute(IElementListener listener) {
      listener.afterClear(this); 
    }      
  });
}

private interface IAction {
  public void execute(IElementListener listener);
}

private void notify(IAction action) {
  IElementListener[] listeners = getListeners();
  for (int i = 0; i < listeners.length; i++) {
    action.execute(listeners[i]);
  }    
}

Anmerkungen

Dieser Code ist Teil der Klasse Elements. Instanzen dieser Klasse verwalten eine Sammlung von Elementen. Hierzu können Elemente u.a. hinzugefügt, abgefragt und wieder gelöscht werden. Die Klasse implementiert das Observer-Muster, so dass sich Clients auf Änderungen abonnieren können.

Die Klasse Elements implementiert ein einfaches Locking, um sich gegen konkurrierende Zugriffe zu schützen. Hierzu dienen die privaten Methoden lock() und unlock(); diese sind korrekt umgesetzt.

Die clear() Methode erlaubt es, alle Einträge einer Elements-Instanz zu löschen. Abonnierte Clients erhalten entsprechende before- und after-Benachrichtigungen über notifyBeforeClear() bzw. notifyAfterClear() Aufrufe.

Der Code compiliert und ist lauffähig, enthält aber mindestens einen Fehler, der dazu führt, dass ein Elements-Objekt unter bestimmten Umständen nicht mehr korrekt verwendet werden kann.

Über diesen bugTeaser diskutieren.



#004: Die Referenzfalle #002: Die Makrofalle

Druckbare Version