Announcement

Collapse
No announcement yet.

Vorteil Interface verwenden anstatt konkreter Klasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vorteil Interface verwenden anstatt konkreter Klasse

    Hallo!

    Ich lese oft, dass man, u. a. zum Entkoppeln von Klassen, besser gegen ein abstraktes Interfaces programmiert, als gegen die Klasse selber. Man braucht sich dann nicht um die Implementierungsdetails kümmern.

    Also die Methode so deklarieren:
    Code:
    public void someMethod(List param);
    anstatt so:

    Code:
    public void someMethod(ArrayList param);
    Ich sehe auch oft, dass bspw. eine ArrayList so erzeugt wird:

    Code:
    List<String> list = new ArrayList<>();
    Aber ich habe hier doch dann das Problem, dass ich nur die Methoden verwenden kann, die List bereitstellt, oder? Sollte ich ein List-Objekt übergeben, dass noch 5 neue Methoden hat, kann ich die ja gar nicht nutzen, oder?

    Verliere ich durch die Verwendung des Interfaces als Parameter bzw.als Referenz nicht an Funktionalität, obwohl ich an Flexibilität gewinne?

  • #2
    Verliere ich durch die Verwendung des Interfaces als Parameter bzw.als Referenz nicht an Funktionalität, obwohl ich an Flexibilität gewinne?
    Du solltest nur soviel veröffentlichen wie die Methode intern tatsächlich brauchst und wenn die Methode mehr an Funktionalität braucht als List liefert ja dann mußt du halt was konkreteres nehmen. Du sollst halt nur nicht leichtfertig was viel zu konkreteres benutzen weil du dann die Flexibilität dieser Methode für den Nutzer der Methode einschränkst. Du solltest also eher immer vom Benutzer der Methode aus denken als von demjenigen der die Methode implementiert und für den gilt um so weniger konkret umso universeller einsetzbar. Es wäre ärgerlich wenn jemand an deiner Methode mit einem Vector ankommt du aber eine ArrayList erzwingt intern aber doch nur zum Beispiel über die Elemente darin iterierst. Da hätte dann vollkommen gereicht List oder sogar nur Iterable zu verwenden.

    Comment


    • #3
      Generell solltest Du konkrete Implementierungen immer moeglichst verstecken. Solltest Du natuerlich an einer gewissen Stelle genau die eine Implementierung brauchen, dann fuehrt auch kein Weg drum herum genau diese Implementierung zu verwenden.

      Durch Interfaces gewinnst Du aber die Moeglichkeit verschiedene Implementierungen eines Interface an derselben Stelle im Code zu benutzen. In .Net gibt es z.B. das IEnumerable Interface. Saemtliche Listen, Arrays, Dictionaries usw. implementieren dieses Interface. Nun kannst Du alle Funktionen die nur IEnumerable als Parameter akzeptieren List, Arrays und Dictionaries uebergeben statt nur einen konkreten Typen.

      Meine Frage waere: Warum sollte es ein anderes List Objekt geben dass noch 5 neue Methoden hat? Fuer mich klingt das eher nach schlechtem Softwaredesign. Allerdings ist das auch sehr geschmacksabhaengig und kann meistens auch nur mit viel Erfahrung einigermassen gemeistert werden

      Comment


      • #4
        Aber ich habe hier doch dann das Problem, dass ich nur die Methoden verwenden kann, die List bereitstellt, oder? Sollte ich ein List-Objekt übergeben, dass noch 5 neue Methoden hat, kann ich die ja gar nicht nutzen, oder?
        Nein, das Objekt selber ist natürlich eine ArrayList;, eine konkrete Klasse


        Meine Frage waere: Warum sollte es ein anderes List Objekt geben dass noch 5 neue Methoden hat?
        https://docs.oracle.com/javase/7/doc...util/List.html
        Siehe All Known Implementing Classes
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          https://docs.oracle.com/javase/7/doc...util/List.html
          Siehe All Known Implementing Classes
          Ja schon. Aber wenn ich Funktionen irgendwo anders brauche kann ich auch nicht das Interface verwenden. Dann erwarte ich dort ja genau den Typ der Liste.

          Comment

          Working...
          X