Если вы передадите список возможных значений, то вы можете сделать это без особой зависимости от типа enum
.
public static <T> T findByString(T[] values, String toString) {
Objects.requireNonNull(toString);
for (T t : values) {
if (toString.equals(t.toString())) {
return t;
}
}
throw new IllegalArgumentException();
}
Позвонить по номеру:
Blah blah = SomeClass.findByString(Blah.values(), str);
Вместо того, чтобы каждый раз вызывать Blah.values()
, вы можете использовать его для помещения в объект, который можно передавать и использовать в общем. Возможно, другие методы добавлены позже.
public interface ByString<T> { // Choose a better name.
T find(String toString);
}
[...]
private static final ByString<Blah> blahs = byString(Blah.values());
[...]
public static <T> ByString<T> byString(T[] values) {
final T[] valuesCopy = values.clone();
return new ByString<T>() {
public T find(String toString) {
return SomeClass.findByString(valuesCopy, toString);
}
};
}
[...]
Позвонить по номеру:
Blah blah = blahs.find(str);
На самом деле, вы можете оптимизировать это. Сделайте toString
один раз и используйте карту.
public static <T> ByString<T> byString(T[] values) {
final Map<String,T> byToStrings = new HashMap<>(
(int)(values.length/0.75f)+1 // Doesn't HashMap construction suck.
);
for (T value : values) {
byToStrings.put(values.toString(), value);
}
return new ByString<T>() {
public T find(String toString) {
T value = byToStrings.get(toString);
if (value == null) {
throw new IllegalArgumentException();
}
return value;
}
};
}