mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-26 06:48:04 +02:00
365 lines
14 KiB
TeX
365 lines
14 KiB
TeX
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
|
|
\usepackage{../templates/myStyle}
|
|
|
|
\begin{document}
|
|
\title{\titleText}
|
|
\subtitle{Wildcards, equals(), Exceptions}
|
|
\author{\tutor}
|
|
\date{\today}
|
|
\subject{Programmieren}
|
|
|
|
\frame{\titlepage}
|
|
|
|
\frame{
|
|
\frametitle{Inhaltsverzeichnis}
|
|
\setcounter{tocdepth}{1}
|
|
\tableofcontents
|
|
\setcounter{tocdepth}{2}
|
|
}
|
|
|
|
\section{Einleitung}
|
|
\subsection{Quiz}
|
|
\begin{frame}{Quiz}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main.java}
|
|
\end{minipage}
|
|
\hspace{0.5cm}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Fruit.java, frame=lines, firstline=1, lastline=1]{java}{Fruit.java}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Apple.java, frame=lines, firstline=1, lastline=1]{java}{Apple.java}
|
|
\begin{itemize}
|
|
\item Gibt es einen Compiler-Fehler?
|
|
\item Gibt es einen Laufzeit-Fehler?
|
|
\item Gibt es eine Ausgabe? Welche?
|
|
\end{itemize}
|
|
\end{minipage}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz: Antwort}
|
|
\begin{block}{Compiler-Fehler}
|
|
Type mismatch: cannot convert from List<Apple> to List<Fruit>
|
|
\end{block}
|
|
|
|
\begin{itemize}[<+->]
|
|
\item Ohne Zeile 16 gibt es folgende Ausgabe:\\
|
|
\myCode{class java.util.LinkedList}\\
|
|
\myCode{class java.util.LinkedList}
|
|
\item Sowohl \myCode{myFruits = myApples;} als auch \myCode{myApples = myFruits;}
|
|
geben einen Compiler-Fehler
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz: Problem}
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Fruit-Example-Problem.java}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz: Lösung \#1}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution.java}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Quiz: Lösung \#2}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution2.java}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Beispiel}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cage.java, frame=lines]{java}{Cage.java}
|
|
\end{minipage}
|
|
\hspace{0.5cm}
|
|
\begin{minipage}[b]{0.45\linewidth}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Animal.java}
|
|
\end{minipage}
|
|
|
|
{\tiny Source: \href{http://stackoverflow.com/a/6828257/562769}{StackOverflow}}
|
|
\end{frame}
|
|
|
|
\section{Generics}
|
|
\subsection{Wildcards}
|
|
\begin{frame}{Wildcards}
|
|
\begin{itemize}[<+->]
|
|
\item Das \myCode{?} in \myCode{List<?> myList} wird Wildcard
|
|
genannt
|
|
\item \myCode{?} steht immer nur in der Deklaration, nie in der Initialisierung
|
|
\item[$\Rightarrow$] \myCode{?} nur links vom \myCode{=}
|
|
\item \myCode{List<?> myList} ist eine "`unbounded Wildcard"'
|
|
\begin{itemize}
|
|
\item \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=1, lastline=3]{java}{singleLines.java}
|
|
\item \myCode{?} ein bestimmter, aber nicht angegebener Parameter\\
|
|
\item[$\Rightarrow$] kann zur Compile-Zeit nicht überprüft werden\\
|
|
\item[$\Rightarrow$] Liste darf nicht modifiziert werden
|
|
\end{itemize}
|
|
\item \myCode{List<? extends Fruit> myList} und \myCode{List<? super Fruit> myList} sind "`bounded Wildcards"'
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Bounded Wildcards: extends}
|
|
\begin{itemize}[<+->]
|
|
\item \myCode{List<? extends Fruit> myList} kann als Elemente
|
|
\myCode{Fruit} und \myCode{Apple} haben, nicht jedoch
|
|
\myCode{Object}
|
|
\item Hinweis: "`extends"' ist hier nicht exakt das gleiche
|
|
wie bei der Vererbung. Es kann entweder wirklich "`extends"'
|
|
oder "`implements"' bedeuten
|
|
\item Sowohl in \myCode{List<Fruit>} als auch in
|
|
\myCode{List<? extends Fruit>} können
|
|
\myCode{Fruit} und \myCode{Apple} beinhalten
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Bounded Wildcards: super}
|
|
\begin{itemize}[<+->]
|
|
\item \myCode{List<? super Fruit> myList} kann als Elemente
|
|
\myCode{Fruit} und \myCode{Object} haben, nicht jedoch
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Namenskonvetionen}
|
|
Für die Parameter sind folgende Bezeichnungen üblich:
|
|
\begin{itemize}
|
|
\item E - Element (used extensively by the Java Collections Framework)
|
|
\item K - Key
|
|
\item N - Number
|
|
\item T - Type
|
|
\item V - Value
|
|
\item S, U, V etc. - 2nd, 3rd, 4th types
|
|
\end{itemize}
|
|
|
|
z.B.
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=23, lastline=39]{java}{singleLines.java}
|
|
\end{frame}
|
|
|
|
\subsection{Generics und Polymorphismus}
|
|
\begin{frame}{Generics und Polymorphismus}
|
|
\begin{itemize}
|
|
\item Polymorphismus: \myCode{Fruit myVariable = new Apple();}\\
|
|
{\tiny links allgemeiner als rechts}
|
|
\item Generics: \myCode{LinkedList<Fruit> myList = new LinkedList<Apple>();}\\
|
|
{\tiny Compiler-Fehler: Type mismatch: cannot convert from LinkedList<Apple> to LinkedList<Fruit>}
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\subsection{Fazit}
|
|
\begin{frame}{Fazit}
|
|
\begin{itemize}
|
|
\item Wildcards sind schwer
|
|
\item Wildcards werdet ihr vermutlich bei den Abschlussaufgaben
|
|
nicht benötigen
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\subsection{Quellen und Ressourcen}
|
|
\begin{frame}{Quellen und Ressourcen}
|
|
\begin{itemize}
|
|
\item \href{http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html}{JavaDoc Tutorial - Wildcards}
|
|
\item \href{http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html}{JavaDoc Tutorial - Wildcards} (extra)
|
|
\item \href{http://stackoverflow.com/q/3009745/562769}{What does the question mark in Java generics' type parameter mean?}
|
|
\item \href{http://stackoverflow.com/q/12340808/562769}{What's the difference between List<Object> and List<?>}
|
|
\item \href{http://stackoverflow.com/q/12348777/562769}{Java: Wildcards again}
|
|
\item \href{http://stackoverflow.com/q/14091771/562769}{Incompatible type with Arrays.asList()}
|
|
\item \href{http://stackoverflow.com/q/252055/562769}{Java Generics (Wildcards)}
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\section{equals}
|
|
\subsection{Allgemein}
|
|
\begin{frame}{Allgemein}
|
|
\begin{itemize}[<+->]
|
|
\item Man will ein beliebiges Objekt mit dem momentanen
|
|
Objekt auf Gleichheit vergleichen
|
|
\item Dazu nutzt man \myCode{myObject.equals(otherObject);}
|
|
\item \myCode{myObject} muss dann die \myCode{equals(Object obj)} implementieren
|
|
\end{itemize}
|
|
|
|
Die Implementierung läuft fast immer gleich ab:
|
|
\begin{itemize}[<+->]
|
|
\item ist \myCode{obj == null} $\rightarrow$ \myCode{return false;}
|
|
\item ist \myCode{!(obj instanceof MyClass)} $\rightarrow$ \myCode{return false;}
|
|
\item other = (MyClass) obj;
|
|
\item vergleich der (relevanten) Attribute
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\subsection{Eclipse}
|
|
\begin{frame}{Eclipse}
|
|
\begin{itemize}
|
|
\item Eclipse kann die equals()-Methode generieren
|
|
\item \menu{Source > Generate hashCode() and equals()...}
|
|
\item Felder auswählen, die für den vergleich wichtig sind
|
|
\item nochmals drüber schauen
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\section{Exceptions}
|
|
\subsection{Allgemeines}
|
|
\begin{frame}{Allgemeines}
|
|
Exceptions \dots
|
|
\begin{itemize}[<+->]
|
|
\item \dots sind Objekte vom Typ Throwable
|
|
\item \dots unterbrechen den normalen Ablauf eines Programms
|
|
\item Mit dem Schlüsselwort \myCode{throw} werden Exceptions
|
|
geworfen und mit \myCode{catch} kann man sie abfangen.
|
|
\end{itemize}
|
|
|
|
\pause[\thebeamerpauses]
|
|
|
|
\begin{exampleblock}{Beispiele für Exceptions}
|
|
\begin{itemize}
|
|
\item NullPointerException
|
|
\item ArrayIndexOutOfBoundsException
|
|
\item IllegalArgumentException
|
|
\item IllegalStateException
|
|
\item IOException
|
|
\item \dots
|
|
\end{itemize}
|
|
\end{exampleblock}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Beispiel: Fibonacci.java}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Fibonacci.java}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Beispiel: Main.java}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main-Fibonacci.java}
|
|
\end{frame}
|
|
|
|
\subsection{Pokemon Exception Handling}
|
|
\begin{frame}{Anti-Pattern: Pokémon Exception Handling}
|
|
\includegraphics[width=0.5\linewidth]{pokemon.jpg}
|
|
|
|
For when you just Gotta Catch 'Em All.
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=5, lastline=9]{java}{singleLines.java}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Anti-Pattern: Pokémon Exception Handling}
|
|
Niemals Pokémon Exception Handling anwenden!
|
|
\begin{itemize}[<+->]
|
|
\item Die Fehlerbehandlung mit \myCode{catch} wird verwendet,
|
|
um den Programmablauf nach einem Fehler zu definieren
|
|
\item Bei unterschiedlichen Fehlern will man meist unterschiedlich
|
|
weiter machen, z.B.
|
|
\begin{itemize}
|
|
\item IOException: nochmals versuchen
|
|
\item NullPointerException: Fehlerbericht an den Entwickler schicken
|
|
\item IllegalArgumentException: Fehlerausgabe an den Nutzer
|
|
\end{itemize}
|
|
\item Durch die verschiedenen \myCode{catch}-Blöcke zeigst du,
|
|
dass du an die verschiedenen Fehlerarten gedacht hast
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Größe des try-Blocks}
|
|
\begin{block}{Wichtig}
|
|
Der try-Block sollte so klein wie möglich sein.
|
|
\end{block}
|
|
|
|
Gründe:
|
|
\begin{itemize}
|
|
\item Beim lesen eures Codes wird klarer, wo das Problem
|
|
auftreten kann
|
|
\item Effizienz
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Eigene Exceptions}
|
|
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=UniverseExplodeException.java, frame=lines]{java}{UniverseExplodeException.java}
|
|
\end{frame}
|
|
|
|
\begin{frame}{@throws und throws}
|
|
\begin{itemize}
|
|
\item Exceptions, die nicht von RuntimeException erben, müssen angekündigt werden
|
|
\item Ankündigen funktioniert über JavaDoc-Annotation \myCode{@throws} und Methodensignatur mit \myCode{throws}
|
|
\end{itemize}
|
|
|
|
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=11, lastline=21]{java}{singleLines.java}
|
|
\end{frame}
|
|
|
|
\subsection{Literatur}
|
|
\begin{frame}{Literatur}
|
|
\begin{itemize}
|
|
\item \href{http://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html}{Catching and Handling Exceptions}
|
|
\item \href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html\#jls-14.20}{JLS 7, Kapitel 14.20}
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\section{Praxis}
|
|
\subsection{Türme von Hanoi}
|
|
\begin{frame}{Türme von Hanoi: Beschreibung}
|
|
Das Spiel besteht aus drei Stäben A, B und C, auf die mehrere gelochte Scheiben gelegt werden,
|
|
alle verschieden groß.\\
|
|
Zu Beginn liegen alle Scheiben auf Stab A, der Größe nach geordnet, mit der
|
|
größten Scheibe unten und der kleinsten oben.\\
|
|
Ziel des Spiels ist es, den kompletten Scheiben-Stapel
|
|
von A nach C zu versetzen.\\
|
|
Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes auf einen
|
|
der beiden anderen Stäbe gelegt werden, vorausgesetzt, dort liegt nicht schon eine kleinere Scheibe.
|
|
Folglich sind zu jedem Zeitpunkt des Spieles die Scheiben auf jedem Feld der Größe nach geordnet.
|
|
\end{frame}
|
|
|
|
\begin{frame}{Aufgaben}
|
|
\begin{block}{Klasse "`Disc"'}
|
|
Schreiben Sie zunächst eine Klasse Disc, die eine gelochte
|
|
Scheibe repräsentiert und als Attribut einen Durchmesser hat.
|
|
\end{block}
|
|
|
|
\begin{block}{Klasse "`Pole"'}
|
|
Schreiben Sie außerdem eine Klasse Pole, die einen Stab repräsentiert. Ein solcher Stab verwaltet eine
|
|
Menge von Discs (in einem fest dimensionierten Array) und hat als Attribut einen Namen. Die Klasse
|
|
Pole stellt dabei sicher, dass die Scheiben immer in geordneter Reihenfolge (wie oben beschrieben)
|
|
auf dem Stab liegen. Hierfür stellt die Klasse Pole die Methoden
|
|
\myCode{public boolean push(Disc d)} und
|
|
\myCode{public Disc pop()} zur Verfügung.
|
|
\end{block}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Aufgaben}
|
|
\begin{block}{Methode push}
|
|
Die Methode push(Disc d) legt die Scheibe d auf den Stab,
|
|
falls dieser noch nicht voll ist und
|
|
der Durchmesser der Scheibe d kleiner ist als der Durchmesser
|
|
der obersten Scheibe des Stabes. Wird
|
|
die Scheibe erfolgreich auf den Stab gelegt, so ist der
|
|
Rückgabewert der Methode true, andernfalls
|
|
false.
|
|
\end{block}
|
|
|
|
\begin{block}{Methode pop}
|
|
Die Methode pop() entfernt die oberste Scheibe des Stabes und
|
|
liefert diese als Rückgabewert. Falls
|
|
der Stab leer ist, soll der Rückgabewert null sein.
|
|
\end{block}
|
|
|
|
Schreiben Sie, falls nötig, weitere Schnittstellen
|
|
(z.B. eine Methode size()) und toString()-Methoden.
|
|
\end{frame}
|
|
|
|
\begin{frame}{Aufgaben}
|
|
Eine weitere Klasse Hanoi soll die main-Methode und eine Methode mit der Signatur
|
|
\myCode{public static void move(Pole from, Pole help, Pole to)}
|
|
erhalten. Die Methode \myCode{move(Pole from, Pole help, Pole to)} legt dabei alle Scheiben das
|
|
Stabes from mit Hilfe des Stabes help auf den Stab to. Implementieren Sie diese Methode rekursiv.
|
|
Erzeugen Sie dann in der main-Methode einen Stab A mit mehreren Scheiben und zusätzlich zwei leere
|
|
Stäbe B und C. Verwenden Sie dann die Methode move(), um die Scheiben von Stab A mit Hilfe des
|
|
Stabes B auf Stab C zu legen.
|
|
\end{frame}
|
|
|
|
\section{Abspann}
|
|
\subsection{Klausuranmeldung}
|
|
\begin{frame}{Klausuranmeldung}
|
|
Ist die Klausuranmeldung schon möglich? Bitte anmelden!
|
|
\end{frame}
|
|
|
|
\subsection{Kommende Tutorien}
|
|
\begin{frame}{Kommende Tutorien}
|
|
\begin{itemize}
|
|
\item[4.] 07.01.2013
|
|
\item[3.] 14.01.2013
|
|
\item[2.] 21.01.2013
|
|
\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
|
|
\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
|
|
\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/Teach-yourself-C++-in-21-days.png}
|
|
|
|
\end{document}
|