Typy wyliczeniowe w Javie.
Stosowane wtedy gdy mamy do czynienia z zestawami stałych.
Najprostsza definicja :
public enum Kolor
{ trefl,karo,kier,pik }
Możliwe działania :
public class TestKolor
{
void test()
{ Kolor kolor= Kolor.trefl;
System.out.println(kolor+" "+kolor.name()+" "+kolor.ordinal());
kolor= Kolor.valueOf("karo");
System.out.println(kolor+" "+kolor.name()+" "+kolor.ordinal());
kolor= Enum.valueOf(Kolor.class,"kier");
System.out.println(kolor+" "+kolor.name()+" "+kolor.ordinal());
kolor= Kolor.values()[3];
System.out.println(kolor+" "+kolor.name()+" "+kolor.ordinal());
switch(kolor)
{ case trefl: System.out.println("wybraleś trefl "); break;
case karo: System.out.println("wybraleś karo "); break;
case kier: System.out.println("wybraleś kier "); break;
case pik: System.out.println("wybraleś pik "); break;
}
for(Kolor k:Kolor.values())
System.out.println(k);
}
}
Możliwe jest definiowanie własnych metod ( przykład kolorów przy grze w tysiąca ) :
public enum Kolor
{
trefl("zoledz",60),
karo("dzwonek",80),
kier("czerwien",100),
pik("wino",40);
private String alias;
private int meldunek;
Kolor(String alias,int meldunek)
{this.alias=alias; this.meldunek=meldunek;}
String dajAlias()
{ return alias; }
int dajMeldunek()
{return meldunek;}
public static Kolor valueOfAlias( String s )
{ try { return valueOf( s ); }
catch ( IllegalArgumentException e )
{ for ( Kolor k : Kolor.values() )
if ( k.dajAlias().equals(s))
return k;
throw new IllegalArgumentException( " nieznany kolor : " + s );
}
}
}
public class TestKolor
{ void test()
{ Kolor kolor= Kolor.trefl;
System.out.println(kolor+" "+kolor.dajAlias()+" "+kolor.dajMeldunek());
kolor= Kolor.valueOfAlias("dzwonek");
System.out.println(kolor+" "+kolor.name()+" "+kolor.ordinal());
kolor= Kolor.valueOfAlias("kier");
System.out.println(kolor+" "+kolor.name()+" "+kolor.ordinal());
}
}
Można również definiować różne metody dla każdej z wartości.
public enum Operation {
PLUS { double eval(double x, double y) { return x + y; } },
MINUS { double eval(double x, double y) { return x - y; } },
TIMES { double eval(double x, double y) { return x * y; } },
DIVIDE { double eval(double x, double y) { return x / y; } };
// Do arithmetic op represented by this constant
abstract double eval(double x, double y);
}
public void test ( ) {
double x = 5.0;
double y = 10.0);
for (Operation op : Operation.values())
System.out.printf("%f %s %f = %f%n", x, op, y, op.eval(x, y));
}