# Eine Art Basisklasse für Enums



## GilbertGrape (26. Jun 2009)

Hallo Gemeinde,

nach einiger Zeit muss ich hier auch mal wieder um Hilfe bitten.

Ich habe eine Reihe von Enums. Für alle diese benötige ich 2 Funktionen, die für alle gleich aussehen. Leider (oder vielleicht auch nicht?) kann ich von Enums nicht ableiten. Sonst würde ich die in eine Basisklasse stecken.
Nun hab ich mir überlegt, eine Hilfsklasse zu schreiben.
Das sollte dann ungefähr so aussehen:


```
public class EnumHelper {
	
	public static List<Enum> getList(Enum enumeration){
		List<Enum> list = new ArrayList<Enum>();
		for (Enum element : enumeration.values()){
			list.add(element);
		}
		return list;
	}
	
	public static String[] getValuesAsStrings(Enum enumeration){
		String[] elements = new String[enumeration.values().length];
		for (int i = 0; i <  enumeration.values().length; i++){
			elements[i] = enumeration.values()[i].toString();
		}
		return elements;
	}
}
```

So geht das aber natürlich nicht.
Weiß jemand, wie ich das sonst realisieren könnte?

Danke, Gilbert


----------



## Marco13 (26. Jun 2009)

???:L Hilft sowas

```
import java.util.*;

class TestClass
{
    public static enum TestEnum
    {
        FIRST,
        SECOND,
        THIRD;
    }
}

class EnumHelper
{
    public static void main(String args[])
    {
        System.out.println(getList(TestClass.TestEnum.FIRST.values()));
    }

    public static <T> List<T> getList(T array[])
    {
        return Arrays.asList(array);
    }
}
```
?


----------



## Beni (26. Jun 2009)

Ein bisschen mit Generics und Reflection rumspielen und das sollte gehen:


```
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;


public class Main{
	public static void main( String[] args ){
		List<RetentionPolicy> policies = getList( RetentionPolicy.class );
		System.out.println( policies );
	}
	
	public static <E extends Enum<E>> List<E> getList( Class<E> enumeration ){
 		List<E> list = new ArrayList<E>();
		for( E element : enumeration.getEnumConstants() ){
			list.add(element);
		}
		return list;
	}
}
```


----------



## GilbertGrape (26. Jun 2009)

Marco13 hat gesagt.:


> ???:L Hilft sowas
> 
> ```
> import java.util.*;
> ...



Ja, das hilft natürlich, vielen Dank!  

@Beni: Dir auch vielen Dank für die Mühe, aber da ich mit GWT arbeite, kann ich Reflections nicht benutzen.


----------



## Landei (27. Jun 2009)

Ergänzend wäre noch anzumerken, dass Enums zwar keine Klasse erweitern, aber sehr wohl Interfaces implementieren können.


----------



## Tobias (27. Jun 2009)

Und mit Interfaces, AspectJ und Introductions kann man das ganze auch lösen  ...


----------



## Gelöschtes Mitglied 5909 (27. Jun 2009)

Habe bei meinen Snippets folgendes (ist glaub ich von Josh Bloch):


```
package de.snippets.enums;

public interface EnumHelper {

	public <T extends Enum<?>> T getEnumByName( String name );

	@SuppressWarnings("unchecked")
	public String lower( Enum theEnum );

}


package de.snippets.enums;


@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();
	}

}


package de.snippets.enums;

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);
	}

}
```


und was auch interessant ist:


```
package de.snippets.enums;

public enum Month 
{ 
  JAN(31), FEB(28) 
  { 
    @Override public int getDays( int y ) 
    { 
      return (y & 3) == 0 ? 29 : 28; 
    } 
  }, 
  MAR(31), APR(30), MAY(31), JUN(30), 
  JUL(31), AUG(31), SEP(30), OCT(31), NOV(30), DEC(31); 
 
  private int days; 
 
  private Month( int days ) 
  { 
    this.days = days; 
  } 
 
  public int getDays() 
  { 
    return days; 
  } 
 
  public int getDays( int year ) 
  { 
    return days; 
  } 
}
```


----------



## SlaterB (27. Jun 2009)

die Februar-Tage-Berechnung ist ja recht 'performant', aber für 1901 bis 2099 reichts wohl


----------



## Marco13 (28. Jun 2009)

Der Sinn dieses Snippets erschließt sich mir jetzt nicht ganz...???:L Mag an der Uhrzeit liegen...


----------



## Gelöschtes Mitglied 5909 (28. Jun 2009)

Snippet 1 ist das was der Threadtarter wollte, Snipped 2 war mir vorher unbekannt und fand ich ganz nett


----------

