instanceof-if-else-Anweisungen eleganter lösen

at0m

Mitglied
Hallo zusammen,

ich habe eine Anweisung der folgenden Art:

Code:
if (x instanceof A) {
    doSomething1();
} else if (x instanceof B) {
    doSomething2();
} else if (x instanceof C) {
    doSomething2();
} // usw.

Wie kann man diese Anreihung von if-else-Anweisungen eleganter lösen?

Man könnte die Logik in das Objekt packen und es ein Interface implementieren lassen. Beispiel:

Code:
public interface MyLogic{
    public void doLogic();
}

Erstes Objekt:
Code:
public class A implements MyLogic{
    public void doLogic(){// hier die Logik 1}
}

Zweites Objekt:
Code:
public class B implements MyLogic{
    public void doLogic(){// hier die Logik 2}
}

usw.

Das Problem ist, dass ich die Klassen A, B, C, usw. nicht verändern darf, wodurch es nicht möglich ist, sie das Interface MyLogic implementieren zu lassen.

Wie könnte man das Problem sonst lösen bzw. besser schreiben?

Freue mich über eure Ratschläge!
 
Schon mal was von switch gehört?
Das ist eine Spezielle Anweisung, mit der man eine Variable auf mehrere Zustände prüfen kann:

Java:
//Beispiel mit char:
char hallo;

switch(hallo) {
case 'A': System.out.println(hallo);
              //damit switch verlassen wird
              break;

case 'B': System.out.println(hallo);
              break;
//wenn das ganze keinem der Typen entspricht:
default: //tu was
            break;

}// switch Ende
 
Schon mal was von switch gehört?

Ein Switch funktioniert aber nur mit Integern / Enums / Strings, nicht mit Objekten....

Wenn du also Prüfen willst welcher Speziallisierung die aktuelle Intsanz entspricht , bleibt dir , insofern du kein Interface Implementieren kannst nicht viel über , als über instanceof / getClass zu prüfen welcher Klasse/Spezialisierung dein Objekt zuzuordnen ist.

ggf. könntest du diesen Vorgang / diese Funktionalität aber in einem Handler kapseln.
 
Zuletzt bearbeitet:
Wenn man switch-case verwenden will kann man doch auch folgendes machen:

Object obj = new Object;
String name = obj.getClass().getSimpleName();

So bekommt man den Namen des Objekts und kann switch- case verwenden.
 
Object obj = new Object;
String name = obj.getClass().getSimpleName();

Wäre eine möglichkeit, allerdings müsste man dann hier auch wieder Hardcoded strings in den instanceof prüfungen verwenden.

weiterer Nachteil ist, du musst alle Spezialisierungen kennen !

Hier zur verdeutlichung:
Java:
public class Test{

	class AndererTest extends Test{
		
	}
	
	public static void main(String[] args){
		Test t = new Test();
		Test a = new Test().new AndererTest();
		System.out.println(t.getClass().getSimpleName());
		System.out.println(a.getClass().getSimpleName());
		
		String name = t.getClass().getSimpleName();
		
		switch(name){
		case "Test":
			break;
		case "AndererTest":
			break;
		case "KlasseDieZumErstellungsZeitpunktNochNichtExistiert":
			break;
		}
	}
	
}
 
Zuletzt bearbeitet:

Zurück
Oben