123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- \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}
|