Null Objekt
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Veränderung (letzte Änderung) (keine anderen Diffs, Normalansicht)

Hinzugefügt: 60a61,62

: Null-Objekte werfen auf die eigentlichen Schnittstellen schon einen Schatten. Typischerweise werden die Interfaces dann nullable, was eine Methode wie isNull() bedeutet. Die meisten Methoden interessieren sich in der Tat nicht dafür, ob ein Objekt ein NullObjekt ist, einige Methoden müssen die Bürde auf sich nehmen, diese Methoden (nennen wir sie Verwaltungsmethoden) werden Objekte erstellen (auswählen) oder zerstören. In SpracheJava entfällt letzeres, in SpracheCpp ergibt sich hieraus sogar mitunter (nämlich bei dynamischer Erzeugung von Nicht-Null-Objekten) die Notwendigkeit, Destruktoren privat zu machen und die (Selbst-)Zerstörung über eine Methode zu steuern, die für das NullObjekt (wenn es dem SingletonPattern? entspricht) nichts tut. WolfPeuker

Siehe auch WardsWiki:NullObject

Definition

Ein NullObjekt ist ein Dummy, der an Stellen eingesetzt wird, wo es kein "echtes" Objekt gibt. Das NullObjekt implementiert die erwartete Schnittstelle des gebrauchten Objektes auf eine (im Verwendungskontext) sinnvolle Weise.

Mit dem Einsatzt des NullObjektes kann man Abfragen auf das Vorhandensein eines Objektes eliminieren.

Beispiele

Beispiel 1: Logging

Eine Bibliothek ermöglicht zu Debugzwecken Logging. Logging ist optional. Will man Logging erlauben, muss man die Bibliothek mit einem Log-Objekt, das folgende Signatur hat, initialisieren.

  interface Log {
    void logEntry(...);
  }

Wenn man keinen Log braucht, initialisiert man die Bibliothek mit null. An vielen Stellen der Bibliothek kann man folgenden Code sehen:

  ...
  if (null != log) {
    log.logEntry(...);
  }
  ...

Mit einem Null-Log kann man den Code vereinfachen:

  ...
  log.logEntry(...);
  ...

Logging ist jetzt nicht mehr optional, man muss die Bibliothek immer mit einem Log initialisieren. Wenn man kein Logging braucht, benutzt man ein Dummyobjekt:

  class NullLog implements Log {
    public void logEntry(...) {
    }
  }

Beispiel 2: Nicht vorhandene Daten

Eine Methode soll Visitenkarten für Mitarbeiter einer Firma drucken. Wir wollen auch Visitenkarten ohne Namen eines Mitarbeiters, auf der nur die Angaben der Abteilung zu sehen sind. Die Methode erwartet als Parameter ein Objekt vom Typ Mitarbeiter, das Namen, Telefonnummer, Faxnummer usw. liefert.

Lösung: Erzeuge ein Dummyobjekt vom Typ Mitarbeiter, das als Name leere Zeichenkette liefert, und die Daten der Abteilung liefert.

Diskussion

Eine Methode, die das NullObjekt verwendet, sollte sich nicht dafür interessieren, ob sie ein "echtes" oder ein NullObjekt verwendet.

Null-Objekte werfen auf die eigentlichen Schnittstellen schon einen Schatten. Typischerweise werden die Interfaces dann nullable, was eine Methode wie isNull() bedeutet. Die meisten Methoden interessieren sich in der Tat nicht dafür, ob ein Objekt ein NullObjekt ist, einige Methoden müssen die Bürde auf sich nehmen, diese Methoden (nennen wir sie Verwaltungsmethoden) werden Objekte erstellen (auswählen) oder zerstören. In SpracheJava entfällt letzeres, in SpracheCpp ergibt sich hieraus sogar mitunter (nämlich bei dynamischer Erzeugung von Nicht-Null-Objekten) die Notwendigkeit, Destruktoren privat zu machen und die (Selbst-)Zerstörung über eine Methode zu steuern, die für das NullObjekt (wenn es dem SingletonPattern? entspricht) nichts tut. WolfPeuker


StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 11. Oktober 2006 23:58 (diff))
Suchbegriff: gesucht wird
im Titel
im Text