2 Stimmen

RTTI vs. zusätzliche Methoden

Einige meiner Klassen sollten anders behandelt werden. Welche Lösung ist besser?

  1. Einführung einer neuen Schnittstelle in meine Klassenhierarchie und Überprüfung, ob die Klasse sie implementiert oder nicht, unter Verwendung von RTTI (Runtime Time Identification)
  2. Hinzufügen einer Methode, die einen booleschen Wert zurückgibt, der angibt, ob diese Klasse normal behandelt werden soll oder eine Sonderbehandlung verdient

Die folgenden Beispiele veranschaulichen die oben genannten Situationen:

1.

interface SpecialTreatment {}

class Base {}    

class Special extends Base implements SpecialTreatment {}

class Normal extends Base {}

Base reference = new Special();
if(reference instanceof SpecialTreatment)
    // do something special
else
    // normal class

2.

interface Treatment {
    boolean special();
}

class Base {}

class Special extends Base implements Treatment {
    boolean special() { return true; }
}

class Normal extends Base implements Treatment {
    boolean special() { return false; }
}

Treatment reference = new Special();
if(reference.special() == true)
    // do something special
else
    // normal class

1voto

Adrian Regan Punkte 2240

Wenn der "Grund" für die unterschiedliche Behandlung der Klasse eine Design-Entscheidung ist, dann kennzeichnen Sie dies durch eine Schnittstellensignatur wie in Lösung 1.

Wenn die Möglichkeit besteht, dass ein Zustand in Ihrer Anwendung dies regelt, dann verwenden Sie Lösung 2.

Ein Beispiel hierfür ist die Schnittstelle java.io.Serializable ohne Methoden oder Felder, die zur Identifizierung von Implementierungen verwendet wird, die serialisierbar sind. Sie entscheiden zur Entwurfszeit, ob das Objekt serialisierbar ist.

Ein Hinweis auf die Leistung von instanceof nach einem zusätzlichen Kommentar.

Sie könnten auch die Verwendung von Anmerkungen als Alternative...

-- BEARBEITUNG NACH BERÜCKSICHTIGUNG DER KOMMENTARE ---

Wenn Sie wirklich nicht die Instanceof (die sehr schnell ist) oder Anmerkungen gehen wollen, könnten Sie dies tun.

interface Special {
    bool isSpecial();
}

abstract class RuntimeSpecial implements Special {
    protected abstract bool _determineSpecial();

    public isSpecial() { return _determineSpecial(); }

}

class IsSpecial implements Special {
    public isSpecial() { return true; }
}

class IsNotSpecial implements Special {
    public isSpecial() { return false; }
}

Erweitern Sie nun alles, was angebracht ist....

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X