Please rethink extended enums inclusion

Paul Benedict pbenedict at apache.org
Fri Oct 7 06:53:24 PDT 2011


I thought the "abstract enum" proposal was one of the best needed
features of Java. After using enums in large software, a hierarchy of
shared code naturally develops, but such common code has to be
refactored into external classes for delegation. It's a shame
"abstract enum" hasn't been seen as important yet.

Paul

On Fri, Oct 7, 2011 at 8:48 AM, Kai Kunstmann <Kai.Kunstmann at combase.de> wrote:
> Hi,
>
> I think, options are limitless, if you out-factor everything into a
> helper class with some static magic:
>
>
> public class Enums
> {
>  private final static Cache CACHE = new Cache();
>
>  private static class Cache
>  {
>    ...
>  }
>
>  public static <E extends Enum<?>> void register(E const, Object code)
>  {
>    CACHE.put(const, code);
>  }
>
>  public static <E extends Enum<?>> E get(Class<E> type, Object code)
>  {
>    return CACHE.get(type, code);
>  }
>
>  // also, have a look at java.util.EnumSet
>  public static boolean in(E needle, E ... haystack)
>  {
>    ...
>  }
> }
>
>
> public enum Sample
> {
>  ONE("one"), TWO("two"), TEN("ten");
>
>  private Sample(String code)
>  {
>    Enums.register(this, code);
>  }
> }
>
>
> public class Client
> {
>  public void doSomething(Object code)
>  {
>    Enums.get(Sample.class, code);
>  }
> }
>
>
> You can probably adopt the example to your needs. Just make sure you
> don't get any race conditions or memory leaks in the Cache code.
>
> By the way, since the registration() code should be executed rarely, you
> can make it expensive and check for what ever conditions you like (e.g.
> call-stack analyses). You can also force a certain interface upon the
> cachable enums or their code type by simply defining it:
>
>
> public static <E extends Enum<E> & Special> void put(E const, Code code)
>
>
> The caveat is, not to register() your constants results in a runtime
> exception on the client side rather than a compile-time exception. This
> can happen, if you simply forget to put the register() call in your
> constructor code, or if you try to access a constant in a fancy way
> before the corresponding enum class is initialized (which usually
> happens the first time you "mention" the class).
>
>
> Cheers,
> Kai
>
>
>
> Am Freitag, den 07.10.2011, 13:34 +0200 schrieb Jose Antonio Illescas
> Del Olmo:
>> Now we have hundred of enums on our project (finantial application with
>> 120.000 lines) an repeat same code on any enum... (*mark as red*)
>>
>>
>> * Map our enums with old legacy system codes:
>>
>>     public enum Type {
>>
>>        ONE("01), TWO("03"), THREE("03"), ...;
>>
>>        private Type(String code) {
>>            setCode(code);
>>        }
>>
>> *      private String code;
>> *
>> *    public String code() {
>>            return code;
>>        }
>>
>>        public void setCode(String code) {
>>            this.code = code;
>>        }
>>
>> **      public static Type fromCode(String code) {
>>            if (code == null) return null;
>>            for(Type type: values()) {
>>               if (type.code.equals(code) return type;
>>            }
>>            return null;
>>        }
>>
>> **      public boolean in(Type... types) {  // IMO all enums must have
>> this method
>>            if (types == null) return false;
>>            for(Type type: types) {
>>               if (this == type) return true;
>>            }
>>            return false;
>>        }
>> *
>> Or with cache to avoid for iteration on fromCode(String) method => more
>> code is necesary
>>
>> public enum Type {
>>
>>        ONE("01), TWO("03"), THREE("03"), ...;
>>
>>        private Type(String code) {
>>            setCode(code);
>>        }
>>
>> *      private String code;
>>
>> **      private static Map<String, Type> cache= new HashMap<String,Type>();
>>
>>        static {
>>            for(Type type: Type.values()) {
>>               cache.put(type.code(), type);
>>            }
>>        }
>> *
>> *    public String code() {
>>            return code;
>>        }
>>
>>        public void setCode(String code) {
>>            this.code = code;
>>        }
>>
>> **      public static Type fromCode(String code) {
>>            return cache.get(code);
>>        }
>>
>> **      public boolean in(Type... types) {  // IMO all enums must have
>> this method
>>            if (types == null) return false;
>>            for(Type type: types) {
>>               if (this == type) return true;
>>            }
>>            return false;
>>        }*
>>
>> /Abstract enums with Generic support reduce dramatically the code of
>> enums, see next code that use abstract enums:
>> /
>> *public enum Type extends MyAbstractEnum<String> {
>>
>>        ONE("01), TWO("03"), THREE("03"), ...;
>>
>>        private Type(String code) {
>>            super(code);
>>        }
>>    }*
>>
>>
>
>
>
>



More information about the coin-dev mailing list