Aufzählungstypen (enum)¶
Motivation¶
Angenommen, Sie wollen mithilfe einer Variablen eine festgelegte Menge an Zuständen beschreiben, z.B.
String tag = "MONTAG" // kann auch Werte "Dienstag" usw. annehmen
int tag = 0; // Magic Number für "Montag"
Das Problem:
- die Variablen können auch beliebige andere Werte (aus dem jeweiligen Wertebereich) annehmen, z.B.
Tag = "hallo"
oderTag=4711
, - Magic Numbers sollen vermieden werden → meistens schlechte Lesbarkeit
- Zustände
EMPTY
(0
),RED
(1
),BLACK
(2
) verschlüsselt → magic numbers field[i][j]
könnte auch beliebige andereint
-Werte annehmen- Code nahezu unlesbar
Erster Verbesserungsversuch: Konstanten¶
public class TicTacToe
{
int[][] field;
static final int EMPTY = 0; // Feld ist leer
static final int RED = 1; // auf das Feld hat rot gesetzt
static final int BLACK = 2; // auf das Feld hat schwarz gesetzt
TicTacToe()
{
field = new int[3][3];
for(int i=0; i<field.length; i++)
for(int j=0; j<field[i].length; j++)
field[i][j]=EMPTY;
}
void makeMove(int i, int j, int player)
{
if(field[i][j]==EMPTY && player==RED || player==BLACK)
field[i][j]=player; // hier wird auf das Feld rot oder schwarz gesetzt
}
}
- etwas besser, aber immer noch beliebige Werte für
field[i][j]
möglich
Der Aufzählungstyp enum
¶
Anforderungen:
- eigener Datentyp
- endliche Anzahl an Zuständen bzw. Werten
- leserliche Bezeichnung der Werte
Lösung:
- Enumerations (sog. Aufzählungstypen)
- Schlüsselwort
enum
Syntax:
Verwendung:
TypName
nun als Datentyp verwendbar, z.B.TypName[][]
- Zugriff auf Werte über statische Punktschreibweise, z.B.
TypName.WERT1
- typsicher
- rot und schwarz über
State.RED
undState.BLACK
erreichbar - andere Zustände nicht möglich
Details:¶
- alle
enum
erben implizit vonjava.lang.Enum
enum
sind Referenztypen- die Konstanten (Werte) in
enum
sind automatischstatic
undfinal
==
kann verwendet werden (auchswitch()
);equals()
gibt es aber auch
Weiteres:¶
- auch Definition von Methoden möglich
toString()
,equals()
usw. ausObject
können überschrieben werden- Konstanten können mit Attributen versehen werden (dann noch privater Konstruktor notwendig)
- Zugriff auf das Array von Konstanten mithilfe von
values()
enum Farben {
KREUZ(12), PIK(11), HERZ(10), KARO(9);
private int farbwert;
private Farben(int wert)
{
this.farbwert=wert;
}
@Override
public String toString()
{
char c = ' ';
switch(this)
{
case KREUZ : c ='\u2663'; break;
case PIK : c ='\u2664'; break;
case HERZ : c ='\u2665'; break;
case KARO : c ='\u2666'; break;
}
return String.valueOf(c);
}
}
enum Karten {
AS(11), ZEHN(10), NEUN(0), ACHT(0), SIEBEN(0), K(4), D(3), B(2);
private int kartenwert;
private Karten(int wert)
{
this.kartenwert=wert;
}
@Override
public String toString()
{
String s = "";
switch(this)
{
case AS : s ="A"; break;
case ZEHN : s ="10"; break;
case NEUN : s ="9"; break;
case ACHT : s ="8"; break;
case SIEBEN : s ="7"; break;
case K : s ="K"; break;
case D : s ="D"; break;
case B : s ="B"; break;
}
return s;
}
}
Ausführliches Beispiel - Skat.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
|