Ich möchte mehrere Operationen basierend auf dem Typ eines Objekts und ohne instanceof
ausführen. Zuerst überlegte ich, Methoden auf der Basis von Typen zu überladen (wie unten zu sehen) und dachte, dass Java die Methode vielleicht (basierend auf der spezifischsten Klasse von Objekten) wählen würde.
Die Ausgabe ist:
%Vor%Aber die Ausgabe, nach der ich suche, ist:
%Vor%instanceof
visitor.accept(this)
in class A
bewirkt, dass die Funktion visitor.accept(A o)
aufgerufen wird. instanceof
, weil ich gelesen habe, dass es eine schlechte Übung ist; wäre es in diesem Fall immer noch schlecht? Diese Antwort berücksichtigt, dass das Ändern bestimmter Klassen und ihrer Beziehung keine Option ist.
Gibt es eine Möglichkeit, Java dazu zu bringen, die Methode auf der Grundlage der meisten zu wählen? spezifischer Typ des Parameterobjekts?
Der Java-Compiler kann das nicht für Sie darstellen, weil das vielleicht nicht das ist, was Sie wollen (in Ihrem Fall ist das das, was Sie wollen, aber vielleicht wollen andere dieses Verhalten nicht und sie wären keine Lösung für sie). Da Sie einen Object
-Verweis an print()
übergeben, ruft der Compiler print(Object)
auf.
Wenn nicht, welche Alternativen kann ich für diese Funktionalität betrachten, ohne die Hilfe von instanceof
Sie können Ihre Object
mit ihrem Typ in eine Wrapper-Klasse schreiben, z. B .:
Auf diese Weise können Sie sicher in den Typ von Object
umwandeln, ohne instanceof
zu verwenden. Obwohl diese IMHO komplizierter ist als die Verwendung von instanceof
, und tatsächlich erstellt sie nur Ihre eigene instanceof
...
Ich bin ehrlich gesagt gegen instanceof, weil ich gelesen habe, dass es schlecht ist trainieren; wäre es in diesem Fall immer noch eine schlechte Übung?
In der Programmierung ist nichts immer eine schlechte Übung . Alles hängt von der Situation ab. In dieser Situation können Sie instanceof
verwenden und unsicheres Casting verwenden, da das Design dies erfordert. Wenn der Operator instanceof
in der Sprache vorhanden ist, wird er verwendet. Wenn instanceof
immer eine schlechte Übung wäre, würde es nicht als Teil der Sprache existieren. Siehe this und < a href="http://www.velocityreviews.com/forums/t302491-instanceof-not-always-bad-the-instanceof-myth.html"> dies .
Ich habe tatsächlich versucht, das Besuchermuster zu simulieren scheint, was Besuchermusterarbeit macht, ist wegen des Doppelten Versand, bei dem der Parameter "akzeptiert" korrekt ist Typ während des Funktionsaufrufs, insbesondere visitor.accept (this) in der Klasse A bewirkt, dass die Funktion visitor.accept (A o) aufgerufen wird.
Überprüfen Sie meinen zweiten Link für Nachteile bei der Verwendung des Besuchermusters.
Nun, meine Antwort wäre, dass die Klassen A, B und C eine gemeinsame Schnittstelle implementieren.
Und dann kann jede von ihnen ihre eigenen spezifischen Implementierungen dieser Schnittstelle haben.
Auf diese Weise können Sie die Methode für alle Objekte aufrufen (wodurch überladene Methoden vermieden werden) und benutzerdefinierte Funktionalität basierend auf dem Objekttyp sicherstellen ( dh die Klasse, von der es instanziiert wurde.
Method Overloading ist ein Kompilierzeit-Polymorphismus, in Ihrer for
-Schleife haben Sie o
als Object
deklariert und daher immer print (Object o) aufgerufen.
Lösung: Verwenden Sie dynamischen Polymorphismus:
%Vor%und die for-Schleife
%Vor%Betrachten Sie das Besucherdesignmuster Ссылка . Obwohl es Änderungen an A, B, C braucht, gibt es sonst keinen anderen Weg.
Ich würde einfach instanceof
hier verwenden. Es ist einfach und klar.
Es ist nicht so, dass es eine harte Regel gibt , um instanceof
nicht zu verwenden. Es gibt keine harten Regeln :) Viele Verwendung von instanceof
kann ein Zeichen dafür sein, dass Sie Dinge ändern können, damit der Compiler mehr Arbeit für Sie erledigt. Ob sich das tatsächlich lohnt, muss von Fall zu Fall untersucht werden. In Ihrem Fall erwähnen Sie, dass Sie die fraglichen Klassen nicht ändern können, also ist es nicht einmal eine Option.
Nach dem Lesen der obigen Antwort
Eine Lösung, die ich vorschlagen könnte, wäre die Überprüfung des Objekttyps mit o.getClass
und fortfahren
Es werden jedoch viele bessere Lösungen veröffentlicht. Ich stimme völlig zu, was @krisna kishor shetty sagte
Was mir in den Sinn kommt, ohne instanceof jetzt zu verwenden, ist:
Code:
%Vor%Code:
%Vor%Aus meiner Sicht ist es nicht die Frage, ob instanceof verwendet werden soll oder nicht. Die Frage ist, wie man die Auswirkungen dieser Situation minimieren kann. Daher würde ich hier den Instanzadapter empfehlen, falls mehrere Operationen ausgeführt werden müssen. Auf diese Weise können Sie zumindest vermeiden, dass diese Komplexität im gesamten System verteilt wird:
%Vor%Dann Schleife:
%Vor%Natürlich wird unser Adapter einen Verweis auf das umgebrochene Objekt haben, wie der Methodenname impliziert. Auf diese Weise erhalten Sie ein Kodierungsmodell, das der direkten Modifikation dieser Klassen nahe kommt.
Tags und Links java polymorphism