Berücksichtigen Sie Java bei der Auswahl der Methode unter überladenen Methoden als den spezifischsten Typ

8

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.

%Vor%

Die Ausgabe ist:

%Vor%

Aber die Ausgabe, nach der ich suche, ist:

%Vor%
  • Gibt es eine Möglichkeit, Java dazu zu bringen, die Methode auszuwählen, die auf dem spezifischsten Typ des Parameterobjekts basiert?
  • Wenn nicht, welche Alternativen kann ich für eine solche Funktionalität betrachten, ohne die Hilfe von instanceof
  • Ich habe tatsächlich versucht, das Besuchermuster zu simulieren, aber es scheint, dass das Arbeiten mit Besuchermustern auf die doppelte Verteilung zurückzuführen ist, die den Parameter "akzeptiert" während der Funktion in den richtigen Typ bringt Aufruf, insbesondere visitor.accept(this) in class A bewirkt, dass die Funktion visitor.accept(A o) aufgerufen wird.
  • Ich bin ehrlich gesagt gegen instanceof , weil ich gelesen habe, dass es eine schlechte Übung ist; wäre es in diesem Fall immer noch schlecht?
Chad 09.08.2013, 14:01
quelle

9 Antworten

4

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 .:

%Vor%

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.

    
m0skit0 09.08.2013, 14:14
quelle
11

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.

    
kkaosninja 09.08.2013 14:06
quelle
3

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%     
Aditya Jain 09.08.2013 14:05
quelle
2

Betrachten Sie das Besucherdesignmuster Ссылка . Obwohl es Änderungen an A, B, C braucht, gibt es sonst keinen anderen Weg.

    
Evgeniy Dorofeev 09.08.2013 14:09
quelle
1

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.

    
overthink 09.08.2013 14:53
quelle
0
%Vor%

Ausgabe: - EIN B C Basis

    
Ankit 09.08.2013 14:09
quelle
0

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

    
Abhishek Singh 09.08.2013 14:20
quelle
0

Was mir in den Sinn kommt, ohne instanceof jetzt zu verwenden, ist:

  • Verwenden Sie eine gemeinsame Schnittstelle für alle, um eine gemeinsame Methode zu verwenden:

Code:

%Vor%
  • Verwenden Sie eine Enum, die eine abstrakte Methode deklariert, die von jedem Typ implementiert wird, den Sie haben:

Code:

%Vor%     
Diego Urenia 09.08.2013 14:19
quelle
0

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.

    
Sir RotN 09.08.2013 14:51
quelle

Tags und Links