diff options
Diffstat (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100067.html')
| -rw-r--r-- | Master/Reference Architectures and Patterns/hjp5/html/k100067.html | 351 |
1 files changed, 351 insertions, 0 deletions
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100067.html b/Master/Reference Architectures and Patterns/hjp5/html/k100067.html new file mode 100644 index 0000000..3e6c0b8 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100067.html @@ -0,0 +1,351 @@ +<html>
+<head>
+<title>
+Handbuch der Java-Programmierung, 5. Auflage
+</title>
+</head>
+<body>
+<a name="startofbody"></a>
+<script language="JavaScript" src="hjp4lib.js">
+</script>
+<script language="JavaScript">
+installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100064.html;106,k100066.html;107,k100068.html;108,k100070.html");
+</script>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100064.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100066.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100068.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100070.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">Kapitel 10 - OOP IV: Verschiedenes
+</table>
+<hr>
+
+
+<!-- Section -->
+<a name="aufzaehlungstypen"></a>
+<h2>10.3 <a name="ixa100614">Aufzählungstypen</a></h2>
+<hr>
+<ul>
+<li><a href="k100067.html#aufzaehlungstypen">10.3 Aufzählungstypen</a>
+<ul>
+<li><a href="k100067.html#sectlevel3id010003001">10.3.1 Grundlagen</a>
+<li><a href="k100067.html#sectlevel3id010003002">10.3.2 Erweiterung der Aufzählungsklasse</a>
+</ul>
+</ul>
+<hr>
+
+
+<!-- Section -->
+<a name="sectlevel3id010003001"></a>
+<h3>10.3.1 Grundlagen </h3>
+
+<p>
+In der Praxis hat man es häufig mit Datentypen zu tun, deren
+Werte aus einem kleinen, konstanten Wertevorrat entnommen werden.
+Beispiele sind die booleschen Werte TRUE und FALSE, die Jahreszeiten
+FRUEHLING, SOMMER, HERBST und WINTER oder die Anredekennzeichen HERR,
+FRAU, FRÄULEIN und FIRMA.
+
+<p>
+Um mit solchen Daten arbeiten zu können, gibt es in vielen Programmiersprachen
+<i>Aufzählungstypen</i>, die es erlauben, einen solchen Datentyp
+zu definieren und seine möglichen Wert-Ausprägungen explizit
+festzulegen. Variablen oder Parameter dieses Typs können dann
+jeweils nur die vereinbarten Werte enthalten. In Sprachen, die das
+nicht vorsehen, behilft man sich meist mit kleinen Ganzzahlen, die
+auf Konstanten gelegt werden, hat dann aber keine Typsicherheit mehr.
+Der Compiler kann bei dieser Technik nicht unterscheiden, ob etwa
+an einen Methodenparameter einer der zulässigen Aufzählungswerte
+übergeben wurde oder ein unzulässiger Wert aus dem übrigen
+Wertebereich der Ganzzahlen.
+
+<p>
+In der Java-Gemeinde gab es seit einiger Zeit Ideen, wie man einen
+Aufzählungstypen in Java realisieren könnte. Joshua Bloch
+<a name="ixa100615"></a> hat in seinem Buch »Effective Java«
+einen sehr ausgefeilten Vorschlag zu dessen Realisierung gemacht.
+Mit der J2SE 5.0 hat er sich nun ein Denkmal gesetzt und diesen Vorschlag
+in den Kern der Sprache eingebaut. Neu eingeführt wurde dazu
+das Schlüsselwort <a name="ixa100616"><a href="index_e.html#ixb100488"><font color=#000080><tt>enum</tt></font></a></a>
+mit dessen Hilfe ein Aufzählungstyp definiert werden kann. In
+seiner einfachsten Form hat er folgende Syntax:
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
+<tr>
+<td valign=top width=100%>
+<font color="#660066">
+<pre>
+enum Typname ( Wert1, Wert2, Wert3, ...)
+</pre>
+</font>
+</td>
+</tr>
+</table>
+
+<p>
+Durch diese Deklaration wird ein Datentyp <font color="#000077"><tt>Typname</tt></font>
+vereinbart, der als möglichen Inhalt die Werte <font color="#000077"><tt>Typname.Wert1</tt></font>,
+<font color="#000077"><tt>Typname.Wert2</tt></font>, <font color="#000077"><tt>Typname.Wert3</tt></font>
+usw. annehmen kann. Unter Verwendung des Typnamens können Variablen
+oder Parameter deklariert werden und die Werte können diesen
+zugewiesen oder in Ausdrücken zur Abfrage verwendet werden. Aufzählungen
+sind als Klassen und ihre Werte als Objekte realisiert, und neben
+den beschriebenen besitzen Aufzählungstypen noch eine Reihe weiterer
+nützlicher Eigenschaften:
+<ul>
+<li>Sie besitzen eine <a href="index_t.html#ixb100327"><font color=#000080><tt>toString</tt></font></a>-Methode,
+die den Namen des Wertes im Klartext ausgibt.
+<li>Sie können mit <a href="index_e.html#ixb100223"><font color=#000080><tt>equals</tt></font></a>
+auf Gleichheit geprüft werden.
+<li>Sie implementieren die Interfaces <a href="index_c.html#ixb100446"><font color=#000080><tt>Comparable</tt></font></a>
+und <a href="index_s.html#ixb100454"><font color=#000080><tt>Serializable</tt></font></a>.
+<li>Sie können in <a href="index_s.html#ixb100079"><font color=#000080><tt>switch</tt></font></a>-Anweisungen
+verwendet werden.
+<li>Der Typname besitzt eine Methode <a name="ixa100617"><a href="index_v.html#ixb100489"><font color=#000080><tt>values</tt></font></a></a>,
+die einen <a href="index_i.html#ixb100125"><font color=#000080><tt>Iterator</tt></font></a>
+liefert, mit dem alle Werte nacheinander durchlaufen werden können.
+<li>Es gibt zwei neue Collection-Klassen <a name="ixa100618"><a href="index_e.html#ixb100490"><font color=#000080><tt>EnumSet</tt></font></a></a>
+und <a name="ixa100619"><a href="index_e.html#ixb100491"><font color=#000080><tt>EnumMap</tt></font></a></a>
+zur Bildung von Mengen von Werten eines Aufzählungstyps.
+</ul>
+
+<p>
+Das folgende Beispiel zeigt diese Eigenschaften in der praktischen
+Anwendung:
+<a name="listingid010008"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Listing1008.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> Listing1008
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> enum Farbe {ROT, GRUEN, BLAU, GELB};
+<font color="#555555">006 </font>
+<font color="#555555">007 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> farbVergleich(Farbe f1, Farbe f2)
+<font color="#555555">008 </font> {
+<font color="#555555">009 </font> System.out.print(f1);
+<font color="#555555">010 </font> System.out.print(f1.equals(f2) ? <font color="#0000FF">" = "</font> : <font color="#0000FF">" != "</font>);
+<font color="#555555">011 </font> System.out.println(f2);
+<font color="#555555">012 </font> }
+<font color="#555555">013 </font>
+<font color="#555555">014 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> String toRGB(Farbe f)
+<font color="#555555">015 </font> {
+<font color="#555555">016 </font> String ret = <font color="#0000FF">"?"</font>;
+<font color="#555555">017 </font> <font color="#0000AA">switch</font> (f) {
+<font color="#555555">018 </font> <font color="#0000AA">case</font> ROT: ret = <font color="#0000FF">"(255,0,0)"</font>; <font color="#0000AA">break</font>;
+<font color="#555555">019 </font> <font color="#0000AA">case</font> GRUEN: ret = <font color="#0000FF">"(0,255,0)"</font>; <font color="#0000AA">break</font>;
+<font color="#555555">020 </font> <font color="#0000AA">case</font> BLAU: ret = <font color="#0000FF">"(0,0,255)"</font>; <font color="#0000AA">break</font>;
+<font color="#555555">021 </font> <font color="#0000AA">case</font> GELB: ret = <font color="#0000FF">"(255,255,0)"</font>; <font color="#0000AA">break</font>;
+<font color="#555555">022 </font> }
+<font color="#555555">023 </font> <font color="#0000AA">return</font> ret;
+<font color="#555555">024 </font> }
+<font color="#555555">025 </font>
+<font color="#555555">026 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">027 </font> {
+<font color="#555555">028 </font> <font color="#00AA00">//Aufzählungsvariablen</font>
+<font color="#555555">029 </font> Farbe f1 = Farbe.ROT;
+<font color="#555555">030 </font> Farbe f2 = Farbe.BLAU;
+<font color="#555555">031 </font> Farbe f3 = Farbe.ROT;
+<font color="#555555">032 </font> <font color="#00AA00">//toString() liefert den Namen</font>
+<font color="#555555">033 </font> System.out.println(<font color="#0000FF">"--"</font>);
+<font color="#555555">034 </font> System.out.println(f1);
+<font color="#555555">035 </font> System.out.println(f2);
+<font color="#555555">036 </font> System.out.println(f3);
+<font color="#555555">037 </font> <font color="#00AA00">//equals funktioniert auch</font>
+<font color="#555555">038 </font> System.out.println(<font color="#0000FF">"--"</font>);
+<font color="#555555">039 </font> farbVergleich(f1, f2);
+<font color="#555555">040 </font> farbVergleich(f1, f3);
+<font color="#555555">041 </font> farbVergleich(f2, f3);
+<font color="#555555">042 </font> farbVergleich(f1, f1);
+<font color="#555555">043 </font> <font color="#00AA00">//Die Methode values()</font>
+<font color="#555555">044 </font> System.out.println(<font color="#0000FF">"--"</font>);
+<font color="#555555">045 </font> <font color="#0000AA">for</font> (Farbe f : Farbe.values()) {
+<font color="#555555">046 </font> System.out.println(f + <font color="#0000FF">"="</font> + toRGB(f));
+<font color="#555555">047 </font> }
+<font color="#555555">048 </font> }
+<font color="#555555">049 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Listing1008.java"><font color="#000055" size=-1>Listing1008.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 10.8: Anwendung von Aufzählungstypen</i></p>
+
+<p>
+Das Programm erzeugt folgende Ausgabe:
+<font color="#333300">
+<pre>
+--
+ROT
+BLAU
+ROT
+--
+ROT != BLAU
+ROT = ROT
+BLAU != ROT
+ROT = ROT
+--
+ROT=(255,0,0)
+GRUEN=(0,255,0)
+BLAU=(0,0,255)
+GELB=(255,255,0)
+</pre>
+</font>
+
+<p>
+Zunächst wird ein Aufzählungstyp <font color="#000077"><tt>Farbe</tt></font>
+vereinbart, mit den Werten <font color="#000077"><tt>ROT</tt></font>,
+<font color="#000077"><tt>GRUEN</tt></font>, <font color="#000077"><tt>BLAU</tt></font>
+und <font color="#000077"><tt>GELB</tt></font>. In <a href="index_m.html#ixb100150"><font color=#000080><tt>main</tt></font></a>
+werden dann einige Variablen deklariert, ihnen Werte zugewiesen und
+diese mit <a href="index_t.html#ixb100327"><font color=#000080><tt>toString</tt></font></a>
+auf der Konsole ausgegeben. Der Aufruf von <font color="#000077"><tt>farbVergleich</tt></font>
+zeigt, wie man Farben als Parameter an eine Methode übergibt.
+In der Methode wird mit Hilfe von <a href="index_e.html#ixb100223"><font color=#000080><tt>equals</tt></font></a>
+verglichen, ob die beiden Werte übereinstimmen. Die Methode <font color="#000077"><tt>toRGB</tt></font>
+zeigt schließlich die Anwendung der <a href="index_s.html#ixb100079"><font color=#000080><tt>switch</tt></font></a>-Anweisung
+auf Aufzählungstypen. Sie wird in einer <a href="index_v.html#ixb100489"><font color=#000080><tt>values</tt></font></a>-Schleife
+auf alle Farbwerte angewendet.
+
+<!-- Section -->
+
+<a name="sectlevel3id010003002"></a>
+<h3>10.3.2 Erweiterung der Aufzählungsklasse </h3>
+
+<p>
+Wie schon erwähnt, werden Aufzählungstypen in (lokale) Klassen
+übersetzt (siehe <a href="k100065.html#lokaleanonymeklassen">Abschnitt 10.1</a>)
+und ihre Werte werden zu Instanzen dieser Klasse. Konsequenterweise
+bietet der Aufzählungstyp die Möglichkeit, diese Klasse
+direkt bei der Deklaration zu erweitern, etwa um eigene Membervariablen
+oder Methoden und damit zusätzliche »Intelligenz« in
+den Aufzählungstyp oder seine Werte zu packen. Wir wollen dazu
+eine Klasse <font color="#000077"><tt>Farbe2</tt></font> vorstellen,
+die einige der zusätzlichen Möglichkeiten demonstriert:
+<a name="listingid010009"></a>
+
+<p>
+<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
+<tr>
+<td valign=top>
+<font color="#000055">
+<pre>
+<font color="#555555">001 </font><font color="#00AA00">/* Farbe2.java */</font>
+<font color="#555555">002 </font>
+<font color="#555555">003 </font><font color="#0000AA">public</font> enum Farbe2
+<font color="#555555">004 </font>{
+<font color="#555555">005 </font> ROT(255, 0 , 0),
+<font color="#555555">006 </font> GRUEN(0, 255, 0),
+<font color="#555555">007 </font> BLAU(0, 0, 255),
+<font color="#555555">008 </font> GELB(255, 255, 0);
+<font color="#555555">009 </font>
+<font color="#555555">010 </font> <font color="#0000AA">private</font> <font color="#0000AA">final</font> <font color="#006699">int</font> r;
+<font color="#555555">011 </font> <font color="#0000AA">private</font> <font color="#0000AA">final</font> <font color="#006699">int</font> g;
+<font color="#555555">012 </font> <font color="#0000AA">private</font> <font color="#0000AA">final</font> <font color="#006699">int</font> b;
+<font color="#555555">013 </font>
+<font color="#555555">014 </font> Farbe2(<font color="#006699">int</font> r, <font color="#006699">int</font> g, <font color="#006699">int</font> b)
+<font color="#555555">015 </font> {
+<font color="#555555">016 </font> <font color="#006699">this</font>.r = r;
+<font color="#555555">017 </font> <font color="#006699">this</font>.g = g;
+<font color="#555555">018 </font> <font color="#006699">this</font>.b = b;
+<font color="#555555">019 </font> }
+<font color="#555555">020 </font>
+<font color="#555555">021 </font> <font color="#0000AA">public</font> String toRGB()
+<font color="#555555">022 </font> {
+<font color="#555555">023 </font> <font color="#0000AA">return</font> <font color="#0000FF">"("</font> + r + <font color="#0000FF">","</font> + g + <font color="#0000FF">","</font> + b + <font color="#0000FF">")"</font>;
+<font color="#555555">024 </font> }
+<font color="#555555">025 </font>
+<font color="#555555">026 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
+<font color="#555555">027 </font> {
+<font color="#555555">028 </font> <font color="#0000AA">for</font> (Farbe2 f : Farbe2.values()) {
+<font color="#555555">029 </font> System.out.println(f + <font color="#0000FF">":"</font> + f.toRGB());
+<font color="#555555">030 </font> }
+<font color="#555555">031 </font> }
+<font color="#555555">032 </font>}</pre>
+</font>
+</td>
+<td valign=top align=right>
+<a href="../examples/Farbe2.java"><font color="#000055" size=-1>Farbe2.java</font></a></td>
+</tr>
+</table>
+<i>
+Listing 10.9: Erweiterung von Aufzählungstypen</i></p>
+
+<p>
+Im Vergleich zum vorigen Beispiel fallen einige Unterschiede auf:
+<ul>
+<li>Die Klasse enthält nun zusätzliche konstante Membervariablen
+<font color="#000077"><tt>r</tt></font>, <font color="#000077"><tt>g</tt></font>
+und <font color="#000077"><tt>b</tt></font>, die den RGB-Wert der
+Farbe aufnehmen können.
+<li>Diese werden bei der Initialisierung der Werte zugewiesen und
+können später nicht mehr verändert werden (sie wurden
+als <a href="index_f.html#ixb100401"><font color=#000080><tt>final</tt></font></a>
+deklariert). Dazu wurde ein Konstruktor mit drei Parametern definiert,
+der anstelle der einfachen Wertzuweisung, wie sie im vorigen Beispiel
+gezeigt wurde, bei der Definition der möglichen Werte aufgerufen
+wird.
+<li>Zusätzlich wurde die Methode <font color="#000077"><tt>toRGB</tt></font>
+in der Aufzählungsklasse implementiert und kann so ohne zusätzliche
+Parameter direkt auf den <font color="#000077"><tt>Farbe2</tt></font>-Werten
+operieren.
+</ul>
+
+<p>
+Die Ausgabe des Programms ist:
+<font color="#333300">
+<pre>
+ROT:(255,0,0)
+GRUEN:(0,255,0)
+BLAU:(0,0,255)
+GELB:(255,255,0)
+</pre>
+</font>
+
+<p>
+Wir haben nun Farbkonstanten, die nicht nur ihren Namen kennen, sondern
+zusätzlich ihren RGB-Wert und diesen auch ausgeben können.
+Dieses Beispiel deutet nur einige der Möglichkeiten an, die diese
+Art der Implementierung mit sich bringt. Grundsätzlich ist ein
+Aufzählungstyp eine gewöhnliche Klasse und kann wie diese
+ausgebaut werden. So könnten beispielsweise auch nicht-konstante
+Member verwendet und durch Methodenaufrufe verändert werden.
+Ob das im Einzelfall sinnvoll ist, muss abgewogen werden.
+<hr>
+<table border=0 cellpadding=0 cellspacing=1 width="100%">
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
+<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
+Wesley, Version 5.0.1
+<tr bgcolor="#EEFFCC">
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100064.html"> << </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100066.html"> < </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100068.html"> > </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="k100070.html"> >> </a>
+<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
+<td align="right">© 1998, 2007 Guido Krüger & Thomas
+Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
+</table>
+<a name="endofbody"></a>
+</body>
+</html>
|
