2016-08-24 1 views
1

Also sagen wir, ich habe zwei fast identische Klassen, aber sie repräsentieren Objekte mit Hauptunterschieden. Im Moment sind diese Unterschiede nicht wirklich umgesetzt.Kann Java in der Lage sein, funktional identische Klassen zu unterscheiden?

So zum Beispiel, eine Klasse, wir nennen es MorningShiftWorker, hat die exakt gleichen Methoden und Konstruktor wie ein anderer, den wir EveningShiftWorker nennen werden. Objekte von diesen beiden sind in einer Liste ihres Supertyps ShiftWorker gespeichert.

Logischerweise ist es sinnvoll, diese beiden Gruppen zu trennen, aber anstatt zusätzliche Variablen zur Mischung hinzuzufügen, dachte ich, dass ich nur Objekte in der ShiftWorker Liste mit instanceof überprüfen würde.

Meine Frage ist: Ist instanceof intelligent genug, um Äpfel von Orangen zu unterscheiden? Diese beiden Klassen sind im Moment in allen außer dem Namen identisch. Ist das genug für instanceof, um sie auseinander zu halten, oder gibt es einen anderen Weg, sollte ich darüber gehen?

+0

Warum versuchst du es nicht einfach? – Manu

+0

sie sind in zwei separaten Klassendateien definiert, keiner erbt von einem anderen, daher ist es keine Instanz eines anderen – user902383

+0

Das hört sich so an, als ob es ernsthafte Modellierungsprobleme geben wird. Sie sollten fast nie "instanceof" verwenden müssen, wenn Ihr Domänenmodell ordnungsgemäß erstellt wurde. – chrylis

Antwort

3

Ja, instanceof überprüft im Wesentlichen, ob das Objekt richtig in die gegebene Klasse umgewandelt werden kann. Angenommen, wir haben diese Klassen:

public class Fruit {} 
public class Orange extends Fruit {} 
public class Apple extends Fruit {} 

Dann in irgendeiner Methode, die wir versuchen:

Fruit f = new Apple(); 
boolean isOrange = f instanceof Orange; //False 

Dies funktioniert auch für leer/nicht-funktionalen Schnittstellen.

+0

Ich habe gehört, dass die Verwendung von instanceof auch schlechtes Code-Design ist. Gibt es alternative Ansätze, die ich auch studieren sollte? Auch danke! Ich hätte es nur testen sollen, aber es war eine stressige Woche und ich bin heute noch nicht ganz am Ball! – TheFunk

+0

@TheFunk werfen Sie einen Blick auf die [Besucher Muster] (http://www.tutorialspoint.com/design_pattern/visitor_pattern.htm) aber in Ihrem Beispiel sagen, Sie hatten eine calcPay(), die anders in den Basisklassen implementiert wurde, könnten Sie Nennen Sie es polymorph aus Ihrer Liste nicht für Besucher oder instanceof – PSD

+0

@TheFunk 'instanceof' bedeutet nicht schlecht Design. Was ich fühle, ist schlechtes Design, wenn Programmierer ihre Logik auf der Grundlage von 'instanceof' konstruieren. Es gibt viele OOP-Paradigmen (z. B. Überladen) und Entwurfsmuster (z. B. Interpreter, Fassade), die das Problem "genau auf welche Art von Objekt diese Referenz verweist" viel sauberer überwinden können. Im Wesentlichen: Haben Sie keine Angst, es zu benutzen, aber erwarten Sie auch nicht, es zu benutzen. – Zircon

0

ja instanceof ist „smart“ genug, da Java-Namen verwendet für Objekte/Klassen Differenzierung nicht

3

Die instanceof Betreiberstruktur nicht den Inhalt der Klassen vergleichen. Es weiß sehr gut, ob x instanceof y oder nicht ist, auch wenn x und y identische Klassen sind mit Ausnahme des Namens.

Es prüft nur, ob der erste Parameter in der Vererbungshierarchie des zweiten Parameters ist, das heißt, alles ist instanceof Object, Integer, Float und seine Freunde sind instanceof Number und natürlich x instanceof y für alle Objekte x vom Typ y.

+0

"' x instanceof x' "Dies ergibt keinen Sinn für' x'. Wenn "x" ein Wert ist, kann es nicht das Recht von "instanceof" sein; Wenn es ein Typ ist, kann es nicht auf der linken Seite sein. –

2

Sie stellen die falsche Frage. Sie sollten fragen: "Wie repariere ich mein defektes Design?".

Wenn Sie Klassen haben, die "fast" identisch sind, aber "duplizierten" Code innerhalb ihrer Methoden und Konstruktoren teilen; dann machst du etwas falsch.

Nie jemals doppelten Code.

Also, anstatt sich Sorgen über instanceof; Sie sollten zurücktreten und Ihre Klassenhierarchie neu entwerfen, um zu finden, bedeutet, wie Sie mit einer gemeinsamen Implementierung der gemeinsamen Sachen enden können; so dass deine Morgen- und Abendshifter nur "diese verschiedenen Aspekte" enthalten.

Sie können "Agile Prinzipien" von Robert Martin überprüfen.Dieses Buch enthält ein schönes Beispiel aus der Praxis eines "Zahlungssystems"; und erklärt sehr detailliert, wie Sie ein System erstellen, in dem Sie Mitarbeiter haben, die in sehr unterschiedlichen Modellen bezahlt werden - ohne alles zu duplizieren. (Sie können sogar die "C#" - Version als PDF kostenlos im Internet finden).

+0

Danke. Im Moment sind die Klassen funktional identisch, enthalten aber in Wirklichkeit keinen gemeinsamen Code. Im Gespräch mit @PSD wurde ich an Polymorphie erinnert. Wenn ich meine Superklasse abstrakte Methoden habe, kann ich sie in meinen Unterklassen definieren, aber sie in der Oberklasse aufrufen, ohne jemals instanceof zu benutzen! : D – TheFunk

+0

Ja, so sollten die Dinge sein. – GhostCat

Verwandte Themen