2016-07-27 17 views
0

Im Moment überprüfe ich, ob ein Objekt eine Instanz von X, Y, Z ist und wenden Sie einige Methoden an. (Dies sind nur Illustrationen :)JAVA - Refactoring mehrere "instanceof" mit einer Liste

if (X instanceof Car || X instaceof Bus || ...) { 
    X.color = RED; 
} 

Allerdings, wenn ich 300 Objekte mit (ex vergleichen: Auto, Bus, Fahrrad, Bahn, Flugzeug, ...) wie würde ich drum herum gehen Faktorisierung? Ich dachte an eine List oder ein Array machen, sondern initialisiert es ein bisschen zu lang scheint:

Car car = new Car(); 
Bus bus = new Bus(); 
... 
List<Transportation> list_t = Arrays.asList(car, bus, ...); 
for (Transportation t : list_t) { 
    if (X instance of t) 
     X.color = RED; 
} 

Anregungen werden sehr geschätzt, danke.

+0

Haben Sie viele dieser "if" -Statements? Gibt es eine Klassenhierarchie oder gibt es keine Typen mit Unterklassen? – Bohemian

+0

Vielleicht möchten Sie in Visitor-Pattern suchen. – Fildor

+0

Warum nicht 'X.color = X.getColor();'? Und dann kannst du natürlich einfach 'X.setColor();' ändern, und dann kannst du es entfernen, indem du es so machst, dass Autos, Busse usw. sowieso immer rot sind. – immibis

Antwort

1

Ich würde entweder eine gemeinsame Elternschnittstelle verwenden.

Oder ich würde eine HashMap verwenden vorausgesetzt, Sie kennen alle möglichen Klassen.

static final Map<Class, Color> classToColorMap = new HashMap<>(); 
static { 
    classToColorMap.put(Car.class, Color.RED); 
} 
+0

Ich frage mich nur. Kann dies verallgemeinert werden, gibt bei gegebenem Objekt eine entsprechende Farbbasis für welche Klasse zurück. Zum Beispiel gibt es eine Funktion. returnClassName (Objektobjekt) {gibt className} zurück? . Ich bin nicht verwandt mit dem Fragesteller. Ich bin nur an diesem Problem interessiert. –

+0

@Optimuskck Sie tun können, 'String classname = object.getClass() getName();.' Oder rufen Sie können 'String classname = object.getClass() getSimpleName();.' –

+0

Ja. aber was ich frage, ist in deiner ersten funktion, wenn ich richtig verstehe, prüft deine erste funktion nur für bestimmte objekte nur. Ich meine, ohne hartes Codieren für spezifisches Objekt können wir nicht auf jedes gegebene Objekt verallgemeinern, das zu einer bestimmten Klasse gehört und eine andere Zeichenkette zurückgibt? . Aber ich beginne zu verstehen, dass ich eine andere Frage stelle. Es tut mir leid. –