From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001
From: Sven Eisenhauer
+Interfaces werden verwendet, um Eigenschaften auszudrücken, die
+auf Klassen aus unterschiedlichen Klassenhierarchien zutreffen können.
+Das erkennt man auch daran, dass ihre Namen oft (substantivierte)
+Eigenschaftswörter sind. Ein bekanntes Beispiel, das mit der
+Version 1.2 in der Java-Klassenbibliothek eingeführt wurde, ist
+das Interface Comparable
+des Pakets java.lang:
+
+
+Dieses Interface kann von Klassen implementiert werden, deren Objekte
+paarweise vergleichbar sind. Die Methode compareTo
+liefert genau dann einen Wert kleiner 0, wenn das Objekt »kleiner«;
+größer 0, wenn es »größer«, und gleich
+0, wenn es »gleich« dem als Argument übergebenen Objekt
+o ist. In der Klassenbibliothek
+gibt es eine ganze Reihe von Klassen, die Comparable
+implementieren, beispielsweise String
+und Character oder die numerischen
+Wrapper-Klassen (letztere werden in Abschnitt 10.2
+erläutert).
+
+
+Mit Hilfe von Comparable
+kann die Reihenfolge der Objekte einer Klasse ermittelt werden. Aus
+dem paarweisen Vergleich läßt sich eine (nicht notwendigerweise
+eindeutige) implizite Ordnung der Elemente ableiten, denn für
+alle aufeinanderfolgenden Objekte a
+und b muss a.compareTo(b)
+<= 0 gelten. Damit ist es möglich, Methoden zu
+schreiben, die das kleinste oder größte Element einer Menge
+von Objekten ermitteln oder diese sortieren:
+
+
+
+
+
+
+ Titel
+ Inhalt
+ Suchen
+ Index
+ DOC
+ Handbuch der Java-Programmierung, 5. Auflage
+
+ <<
+ <
+ >
+ >>
+ API
+ Kapitel 9 - OOP III: Interfaces
+
+
+
+
+
+9.2 Das Interface Comparable
+
+
+
+
+
+public interface Comparable
+{
+ public int compareTo(Object o);
+}
+
+
+
+
+
+
+Listing 9.7: Das Interface Comparable
+
+
+
+
+
+001 /* Listing0907.java */
+002
+003 public class Listing0907
+004 {
+005 public static Object getSmallest(Comparable[] objects)
+006 {
+007 Object smallest = objects[0];
+008 for (int i = 1; i < objects.length; ++i) {
+009 if (objects[i].compareTo(smallest) < 0) {
+010 smallest = objects[i];
+011 }
+012 }
+013 return smallest;
+014 }
+015
+016 public static void bubbleSort(Comparable[] objects)
+017 {
+018 boolean sorted;
+019 do {
+020 sorted = true;
+021 for (int i = 0; i < objects.length - 1; ++i) {
+022 if (objects[i].compareTo(objects[i + 1]) > 0) {
+023 Comparable tmp = objects[i];
+024 objects[i] = objects[i + 1];
+025 objects[i + 1] = tmp;
+026 sorted = false;
+027 }
+028 }
+029 } while (!sorted);
+030 }
+031
+032 public static void main(String[] args)
+033 {
+034 //Erzeugen eines String-Arrays
+035 Comparable[] objects = new Comparable[4];
+036 objects[0] = "STRINGS";
+037 objects[1] = "SIND";
+038 objects[2] = "PAARWEISE";
+039 objects[3] = "VERGLEICHBAR";
+040 //Ausgeben des kleinsten Elements
+041 System.out.println((String)getSmallest(objects));
+042 System.out.println("--");
+043 //Sortieren und Ausgaben
+044 bubbleSort(objects);
+045 for (int i = 0; i < objects.length; ++i) {
+046 System.out.println((String)objects[i]);
+047 }
+048 }
+049 }
+
+
+Listing0907.java
+
+Die Implementierung der Methode getSmallest +ist leicht zu verstehen. Das kleinste Element wird gefunden, indem +jedes Element des Arrays mit dem bis dato kleinsten Element verglichen +wird. Ist es kleiner, wird das bisherige kleinste Element ersetzt, +andernfalls bleibt es unverändert. Die Implementierung von bubbleSort +folgt ebenfalls einem einfachen Schema. In jedem Arraydurchlauf werden +zwei aufeinanderfolgende Elemente vertauscht, falls das zweite kleiner +als das erste ist. Es werden so viele Durchläufe vorgenommen, +bis keine Vertauschung mehr stattgefunden hat. + +
+Bemerkenswert ist hierbei die Generizität +(Typunabhängigkeit) der Lösung. Es spielt keine Rolle, welche +Art von Objekten sortiert wird, solange alle das Interface Comparable +implementieren. Bei Strings ist das standardmäßig der Fall; +eigene Klassen könnten ihre eigene Implementierung von Comparable +beisteuern. Bei Objekten, die auch Groesse +implementieren, könnte beispielsweise das Volumen (Länge +mal Breite mal Höhe) oder eine beliebige andere Verknüpfung +der Raumlängen verwendet werden. +
+
![]() |
+![]() |
+
+
+ +Auch Objekte unterschiedlicher Klassen können problemlos miteinander +verglichen werden, sofern compareTo +dazu in der Lage ist. So ist es leicht vorstellbar, dass sowohl Autos +als auch Fußballplätze und Papierblätter (und eventuell +noch Äpfel und Birnen) auf der Basis ihrer Grundfläche (siehe +Listing 9.5) miteinander verglichen +werden, denn diese Maßzahl hat für alle beteiligten Klassen +eine Bedeutung. |
+
+
|
+![]() |
+
| Titel + | Inhalt + | Suchen + | Index + | DOC + | Handbuch der Java-Programmierung, 5. Auflage, Addison +Wesley, Version 5.0.1 + |
| << + | < + | > + | >> + | API + | © 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de + |