Warum verwenden manche Leute die List-Basisklasse, um eine neue ArrayList zu instanziieren?

7

Ich stoße immer wieder auf Code, wo Leute eine neue ArrayList instanziieren und sie der List-Schnittstelle zuweisen, wie folgt:

%Vor%

Was ist der Grund für diesen Ansatz?

    
S-K' 03.07.2013, 23:10
quelle

4 Antworten

16

Entkoppeln Sie Ihren Code von einer bestimmten Implementierung der Schnittstelle.

Dies hilft Ihnen auch, in Zukunft zu einer anderen Implementierung der Schnittstelle List zu wechseln.

Zum Beispiel -

Sie haben später List<String> names = new ArrayList<String>(); . Sie haben entschieden, dass Sie eine andere Implementierung der List -Schnittstelle verwendet haben sollen, sagen wir LinkedList , damit Sie sie einfach in List<String> names = new LinkedList<String>(); ändern und nichts bricht.

    
JHS 03.07.2013 23:12
quelle
4

Ein solcher Code verwendet nicht die Klasse List , er deklariert die Variable vom Typ List . Dies wird Abstraktion

genannt

List ist eine Schnittstelle , die definiert, welche Methoden die tatsächliche Klasse hat, ohne anzugeben, welche tatsächliche Klasse verwendet wird.

Obwohl dies hier keine große Rolle spielt, kann diese Praxis sehr wichtig sein, sogar in komplexeren Situationen. Es ist eine gute Übung, immer diesem Muster zu folgen.

    
Bohemian 03.07.2013 23:16
quelle
3
%Vor%

Damit schreiben Sie Code gegen die Schnittstelle List , was es leicht macht, die Implementierung in Zukunft zu wechseln, wenn Sie müssen.

In diesem Fall genügt folgendes:

%Vor%

Wenn Sie jetzt etwas wie folgt machen -

%Vor%

Sie werden gegen die Implementierung ArrayList selbst codieren. Und Ihr Code ist an diese spezifische Implementierung gebunden. Falls Sie die Implementierung wechseln müssen, werden viele Code-Änderungen benötigt.

Überprüfen Sie die Dokumentation , um einige der bereitgestellten Standardimplementierungen zu ermitteln von Java 6.

    
Bhesh Gurung 03.07.2013 23:13
quelle
3
  

Programmieren zu einer Schnittstelle, keine Implementierung

Es ist ein Designmuster von Gang of Four (GoF). Warum das?

Sie führen durch einen abstrakten Vertrag anstelle einer konkreten Implementierung.

%Vor%

Was ist mit statt ArrayList Implementierung möchten Sie LinkedList Implementierung?  Auf diese Weise müssen Sie nur diese Eigenschaft mit dem Setter injizieren.

Abstraktion ist der Schlüssel, Sie wissen nichts über die Implementierung nur nach Spezifikation.

Lesen Sie diese Was bedeutet es, an eine Schnittstelle zu programmieren?

    
nachokk 03.07.2013 23:11
quelle

Tags und Links