Inspired by Tom Hotin 's Answer I created a wrapper Class es, but only those with the signature <E extends Enum<E> & Field> :
public final static class FieldEnumWrapper<E extends Enum<E> & Field> { private final Class<E> clazz; private final ImmutableMap<String, E> index; public static <E extends Enum<E> & Field> FieldEnumWrapper<E> of(final Class<E> clazz) { return new FieldEnumWrapper<E>(clazz); } private FieldEnumWrapper(final Class<E> clazz) { this.clazz = clazz; this.index = Maps.uniqueIndex( EnumSet.allOf(clazz), new Function<E, String>() { @Override public String apply(final E input) { return input.searchName(); } }); } public Class<E> clazz() { return clazz; } public Field valueOfSearchName(final String searchName) { return index.get(searchName); } }
Now:
for (final FieldEnumWrapper<?> fieldEnum : ImmutableList.of( FieldEnumWrapper.of(EntityField.class), FieldEnumWrapper.of(AddressField.class), FieldEnumWrapper.of(PersonFunctionType.class))) { valueOfSearchName = fieldEnum.valueOfSearchName("POD_I_OS_PARTNER"); // ...
is type safe and inappropriate using the FieldEnumWrapper static factory:
FieldEnumWrapper.of(NotEnumAndFieldClass.class)
generates a compilation error.
In addition, valueOfSearchName now a FieldEnumWrapper method, which is more important than the helper class.
source share