\section{Beispiel: Sortieren}

\begin{slide}{wesentliche Bestandteile}
\begin{verbatim}
public class Zahl 
   implements Comparable<Zahl> {
      public int compareTo(Zahl that) { .. }
}

Zahl [] a =
   { new Zahl (3), new Zahl (1), new Zahl (4) };
Arrays.sort(a);
\end{verbatim}
\end{slide}

\begin{slide}{Klassen-Entwurf}

\begin{itemize}
\item
  \verb|Zahl| hat  ein \verb|private final| Attribut,

  wird im Konstruktor gesetzt
\item
  \verb|Zahl| implementiert \verb|String toString()|,

  dann funktioniert
\begin{verbatim}
System.out.println(Arrays.asList(a));
\end{verbatim}

\end{itemize}
\end{slide}

\begin{slide}{Richtig vergleichen}

das sieht clever aus, ist aber nicht allgemeingültig:
\begin{verbatim}
   public int compareTo(Zahl that) {
        return this.contents - that.contents;
    }
\end{verbatim}
(merke: \emph{avoid clever code})


\end{slide}

\begin{slide}{Protokollierung mit Dekorator}

Aufgabe: 
\begin{itemize}
\item
alle Aufrufe von \verb|Zahl.compareTo| protokollieren\dots
\item
\emph{ohne} den Quelltext dieser Klasse zu ändern!
\end{itemize}

Lösung: eine Klasse dazwischenschieben

\begin{verbatim}
class Log<E> ... {
    private final contents E;
    int compareTo(Log<E> that) { .. }
}
Log<Zahl> a [] = 
    { new Log<Zahl> (new Zahl (13)), .. };
\end{verbatim}

Diese Klasse heißt \emph{Dekorator},
das ist ein Beispiel für ein Entwurfsmuster.

\end{slide}
