Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe in einem Projekt mehrere enum-Typen, die alle die gleichen Methoden implementieren, z.B.:
Code:
public enum Direction {
FROM, TO;
public static Direction byString(final String param) {
return valueOf(param.toUpperCase());
}
public String low() {
return this.toString().toLowerCase();
}
}
public enum Orientation {
NORTH,EAST,WEST,SOUTH;
public static Orientation byString(final String param) {
return valueOf(param.toUpperCase());
}
public String low() {
return this.toString().toLowerCase();
}
}
...
Ich möchte nun eigentlich doppelten Code vermeiden, also jede Methode nur einmal implementieren. Vererbung steht aber in enum nicht zur Verfügung. Hat einer ne Idee, wie man das Problem am elegantesten lösen kann?
Und was hilft das? Der Threadersteller will eigentlich eine Oberklasse für seine enum-Klassen. Dafür müsste er aber eine Klasse extends Enum schreiben können, was meines Wissens nach nicht geht.
Allerdings kann ich damit nicht meine Methode byString() implementieren, da mir in der Klasse EnumInterfaceImpl nicht die Methode valueOf() zur Verfügung steht.
public interface EnumHelper {
public <T extends Enum<?>> T getEnumByName( String name );
@SuppressWarnings("unchecked")
public String lower( Enum theEnum );
}
Code:
@SuppressWarnings("unchecked")
public class EnumHelperImpl implements EnumHelper {
private Class clazz;
public EnumHelperImpl(Class clazz) {
this.clazz = clazz;
}
@Override
public <T extends Enum<?>> T getEnumByName( String name ) {
return (T) Enum.valueOf(clazz, name);
}
@Override
public String lower( Enum theEnum ) {
return theEnum.name().toLowerCase();
}
}
Code:
public enum Orientation {
NORTH, EAST, WEST, SOUTH;
static EnumHelper helper = new EnumHelperImpl(Orientation.class);
public static Orientation byName(String string) {
return helper.getEnumByName(string);
}
public String lower() {
return helper.lower(this);
}
public static void main( String[] args ) {
Orientation o = Orientation.byName("NORTH");
System.out.println(o);
System.out.println(o.lower());
System.out.println(o instanceof Orientation);
}
}
Danke, das scheint bei der low() Methode zu funktionieren. Ich übergebe das Objekt dem Konstruktur mit dem Übergabetyp EnumInterface.
Bei der byString()-Methode ist es etwas komplizierter. Da muss ich dem Konstruktor zusätzlich das Klassenobjekt übergeben und mir über die Reflection API die Methode valueOf holen (was aufgrund der vielen abzufangenden Exceptions nicht so schön ist). Grundsätzlich scheint das aber zu klappen.
@raiL: ich hatte deinen Beitrag gesehn, nachdem ich meinen Post abgeschickt hatte, aber dann keine Zeit mehr, deinen Tipp auszuprobieren. Vielen Dank, das war genau das, was ich brauchte!