Whouzuo: Frage Interfaces

Beitrag lesen

Hi ich habe eine Frage zu Interfaces und deren Verwendung im Code.
Wenn ich ein Interface habe:

public interface A {
   public void do();
}


> und eine Klasse welche das Implementiert  
> ~~~java
  

> public void B implements A {  
>    public void do() {  
>       // implementierung von do  
>    }  
>    public void print(String s) {  
>       System.out.println(s);  
>    }  
> }  
> 

Wie arbeite ich jetzt damit?
A obj = new B();
oder
B obj = new B();

Ich weiß zwar im 1. Fall dass ich mitm Interface arbeiten kann und ich auf jeden fall die Methode do verwenden kann, aber ich könnte ja außer einem Cast auf B nicht auf print zugreifen.

Richtig! Gut erkannt und gute Frage.
Hier kommt es drauf an. In der Regel wirst du Dein B auch als B deklarieren wollen, aber nicht immer. Casten ist immer sehr schlecht und sollte unter allen Umständen vermieden werden. Sie sind ein Zeichen für schlechtes Design und sorgen unter anderem dafür, dass der Compiler nicht mehr zur Compilezeit mögliche Fehler entdecken kann.

Wenn du also sowieso nur die Methoden des Interfaces brauchst, dann solltest du auch das Interface (also in deinem Beispiel A) für die Deklaration verwenden. Dies hat den Vorteil, dass du später einfach statt "new B()" ein andere Klasse mit "new C()" nutzen kannst und ansonsten _nichts_ am restlichen Code zu ändern brauchst. Brauchst du aber (irgendwann später) die Methoden der Klasse B, dann musst du diese wählen (um den fehleranfälligen Cast zu vermeiden). Dadurch kannst du aber später B nicht einfach durch C austauschen, sondern musst an allen Stellen gucken, wie B verwendet wird und dies entsprechend anpassen.

Wenn man z.B. das Interface Animal und die Klasse Dog implements Animal hat, dann hängt es davon ab, ob du an der jeweiligen Stelle einfach irgendein Animal haben willst oder ob du einen Dog haben willst und auch dessen spezifische Methoden benötigst. Beispiel: wenn du irgendwo HolStöckchen() aufrufen willst, dann nimm Dog. Wirst du nur eat() und sleep() aufrufen (was jedes Animal kann), dann nimm Animal, sodass du später auch statt des Hundes eine Katze einsetzen kannst.