In Java implementieren diese konkreten Klassen alle die Schnittstelle CharSequence:
CharBuffer, String, StringBuffer, StringBuilder
Diese konkreten Klassen haben keine andere gemeinsame Elternklasse als Object, so dass es nichts gibt, was sie miteinander verbindet, außer der Tatsache, dass sie alle etwas mit Arrays von Zeichen zu tun haben, diese darstellen oder manipulieren. So können beispielsweise die Zeichen von String nicht mehr geändert werden, sobald ein String-Objekt instanziiert ist, während die Zeichen von StringBuffer oder StringBuilder bearbeitet werden können.
Jede dieser Klassen ist jedoch in der Lage, die Methoden der CharSequence-Schnittstelle in geeigneter Weise zu implementieren:
char charAt(int index)
int length()
CharSequence subSequence(int start, int end)
String toString()
In einigen Fällen wurden Java-Klassenbibliotheksklassen, die früher String akzeptierten, überarbeitet und akzeptieren nun die CharSequence-Schnittstelle. Wenn Sie also eine Instanz von StringBuilder haben, können Sie, anstatt ein String-Objekt zu extrahieren (was bedeutet, eine neue Objektinstanz zu instanziieren), einfach den StringBuilder selbst übergeben, da er die CharSequence-Schnittstelle implementiert.
Die Schnittstelle Appendable, die von einigen Klassen implementiert wird, hat den gleichen Nutzen für alle Situationen, in denen Zeichen an eine Instanz der zugrundeliegenden konkreten Klassenobjektinstanz angehängt werden können. Alle diese konkreten Klassen implementieren die Schnittstelle Appendable:
BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer
4 Stimmen
Wenn Sie sich daran erinnern können und Ihr Programm optimal sein soll, können Sie kurz vor der Kompilierung die Schnittstellendeklaration gegen die tatsächliche Implementierung austauschen. Die Verwendung einer Schnittstelle fügt eine Ebene der Indirektion hinzu, die zu Leistungseinbußen führt. Verteilen Sie Ihren auf Schnittstellen programmierten Code jedoch...
25 Stimmen
@Ande Turner: Das ist ein schlechter Ratschlag. 1). "Ihr Programm muss optimal sein" ist kein guter Grund für das Auslagern von Schnittstellen! Dann sagen Sie: "Verteilen Sie Ihren programmierten Code trotzdem auf Schnittstellen..." Sie raten also, dass Sie bei Anforderung (1) dann suboptimalen Code veröffentlichen?!?
82 Stimmen
Die meisten der Antworten hier sind nicht ganz richtig. Es bedeutet nicht oder impliziert nicht einmal "das Schlüsselwort interface verwenden". Eine Schnittstelle ist eine Spezifikation, wie etwas zu verwenden ist - gleichbedeutend mit dem Vertrag (schlagen Sie es nach). Getrennt davon ist die Implementierung, die besagt, wie der Vertrag erfüllt wird. Programmieren Sie nur gegen die Garantien der Methode/des Typs, so dass, wenn die Methode/der Typ auf eine Weise geändert wird, die immer noch dem Vertrag entspricht, der Code, der sie verwendet, nicht kaputt geht.
2 Stimmen
@apollodude217 das ist eigentlich die beste Antwort auf der ganzen Seite. Zumindest für die Frage im Titel, da es hier mindestens 3 ganz unterschiedliche Fragen gibt...
7 Stimmen
Das grundsätzliche Problem bei Fragen wie dieser ist, dass sie davon ausgehen, dass "Programmieren für eine Schnittstelle" bedeutet, "alles in eine abstrakte Schnittstelle verpacken", was albern ist, wenn man bedenkt, dass der Begriff das Konzept der abstrakten Schnittstellen im Java-Stil vorwegnimmt.
0 Stimmen
Dies geschieht meist mit COM. Man behandelt ein Objekt, ohne die Klasse zu kennen, sondern nur die Schnittstelle, die es unterstützt.
0 Stimmen
Es ist nur ein schickes Wort für Rückruf . Das ist alles, was es bedeutet. Es bedeutet nur, dass Sie etwas tun (z. B. "Informationen aus dem Netz holen" oder "eine Berechnung durchführen"). Diese andere Sache wird schließlich eine Funktion aufrufen von Ihnen, um Ihnen das Ergebnis mitzuteilen. Oder? Sie müssen also irgendwie den Namen dieser Funktion angeben (die Rückruffunktion). Die "Schnittstelle!" gibt nur den Namen dieser Funktion an. Das ist alles, mehr gibt es nicht.
2 Stimmen
Der Klassiker
List lst = new ArrayList();
bedeutet nur, dass Sie einschränken, welche Funktionen des erstellten Objekts Ihnen zur Verfügung stehen, was völlig dumm ist. Dieses seltsame Konstrukt wird von Java-Lehrern und -Büchern ohne ersichtlichen Grund immer wieder propagiert.0 Stimmen
@Damien, Sie sollten diese Frage nicht mit weiteren Fragen verwechseln. SO ist eine Seite mit 1 Frage pro Thema. Es ist besser, separate Fragen zu stellen und auf diese Frage zu verweisen, wenn sie relevant ist.
1 Stimmen
@Nyerguds Heiliger Bimbam, ganz und gar nicht! Ein Stück Code sollte den engstmöglichen Typ verwenden, da es sich um selbstdokumentierenden Code handelt. Durch diese Einschränkung des Typs weiß ein Programmierer automatisch mehr darüber, wie er verwendet werden könnte. Nehmen wir einen Code, der Folgendes verwendet
ArrayList
. Es könnte tatsächlich etwas Spezielles für diese Implementierung in der Verwendung von ihr erfordern. Dann denken Sie daran, dass SieIterable
- Sie wissen jetzt zu 100 %, dass der Code nur in einer for each-Schleife verwendet wird. Auf diese Weise wird viel mehr Information in einem verständlichen Code vermittelt.0 Stimmen
@user904963 Das bedeutet auch, dass Ihre Funktion eingeschränkt nur für eine Schleife zu verwenden. Das könnte Ihnen bei späteren Aktualisierungen in den Hintern beißen, wenn Sie drei Funktionen tiefer in das Projekt einsteigen.
0 Stimmen
@Nyerguds Ein ähnliches Problem kann auftreten, wenn Sie einen unnötig spezifischen Typ anfordern. Sie können die Implementierung niemals durch einen verwandten Typ ersetzen, der anders implementiert ist. Es ist ein unzulässiger Kurzschluss in der Logik, Allgemeinheit in einem Code als "völlig dumm" zu bezeichnen. Jede Art von Allgemeinheit/Spezifität hat ihren Zweck, aber im Allgemeinen bietet Ihnen die Verwendung des am wenigsten spezifischen Typs die meisten Möglichkeiten, den Code zu ändern. Fragen Sie nach einer
ArrayList
ist beispielsweise nur dann sinnvoll, wenn ein Teil Ihrer API eine Geschwindigkeitsgarantie ist, die auf zusammenhängenden Speicher angewiesen ist. Der meiste Code wird nur eineList
.0 Stimmen
@user904963 Ist nicht ArrayList buchstäblich die einzige Implementierung von List auf Java sowieso?
0 Stimmen
@Nyerguds Nur für die Standardimplementierungen, die in Java eingebaut sind, schauen Sie sich hier "implementiert von" an: docs.oracle.com/javase/8/docs/api/java/util/List.html . Es gibt
AbstractList
,AbstractSequentialList
,ArrayList
,AttributeList
,CopyOnWriteArrayList
,LinkedList
,RoleList
,RoleUnresolvedList
,Stack
etVector
. Sie können auch benutzerdefinierte Klassen erstellen, die dieList
Schnittstelle oder verwenden Sie den Code anderer Personen, die sie implementieren.