Извините, но метод, который вы используете, кажется общепринятым.Я вижу много такого кода в кодовой базе больших библиотек, таких как Spring, Maven и т. Д.
Однако альтернативой может быть введение вспомогательного интерфейса, который может преобразовывать данные из данного ввода в данный вывод.Примерно так:
public interface Converter<I, O> {
boolean canConvert(I input);
O convert(I input);
}
и вспомогательный метод
public static <I, O> O getDataFromConverters(
final I input,
final Converter<I, O>... converters
){
O result = null;
for(final Converter<I, O> converter : converters){
if(converter.canConvert(input)){
result = converter.convert(input);
break;
}
}
return result;
}
Итак, вы можете написать конвертеры многократного использования, которые реализуют вашу логику.Каждый из преобразователей должен будет реализовать метод canConvert(input)
, чтобы решить, будут ли использоваться его процедуры преобразования.
На самом деле: ваш запрос напоминает мне: Try.these (a, b,c) метод в Prototype (Javascript).
Пример использования для вашего случая:
Допустим, у вас есть некоторые bean-компоненты, которые имеют методы проверки.Есть несколько стратегий, чтобы найти эти методы проверки.Сначала мы проверим, присутствует ли эта аннотация в типе:
// retention, target etc. stripped
public @interface ValidationMethod {
String value();
}
Затем мы проверим, существует ли метод с именем «validate».Чтобы упростить ситуацию, я предполагаю, что все методы определяют один параметр типа Object.Вы можете выбрать другой шаблон.Во всяком случае, вот пример кода:
// converter using the annotation
public static final class ValidationMethodAnnotationConverter implements
Converter<Class<?>, Method>{
@Override
public boolean canConvert(final Class<?> input){
return input.isAnnotationPresent(ValidationMethod.class);
}
@Override
public Method convert(final Class<?> input){
final String methodName =
input.getAnnotation(ValidationMethod.class).value();
try{
return input.getDeclaredMethod(methodName, Object.class);
} catch(final Exception e){
throw new IllegalStateException(e);
}
}
}
// converter using the method name convention
public static class MethodNameConventionConverter implements
Converter<Class<?>, Method>{
private static final String METHOD_NAME = "validate";
@Override
public boolean canConvert(final Class<?> input){
return findMethod(input) != null;
}
private Method findMethod(final Class<?> input){
try{
return input.getDeclaredMethod(METHOD_NAME, Object.class);
} catch(final SecurityException e){
throw new IllegalStateException(e);
} catch(final NoSuchMethodException e){
return null;
}
}
@Override
public Method convert(final Class<?> input){
return findMethod(input);
}
}
// find the validation method on a class using the two above converters
public static Method findValidationMethod(final Class<?> beanClass){
return getDataFromConverters(beanClass,
new ValidationMethodAnnotationConverter(),
new MethodNameConventionConverter()
);
}
// example bean class with validation method found by annotation
@ValidationMethod("doValidate")
public class BeanA{
public void doValidate(final Object input){
}
}
// example bean class with validation method found by convention
public class BeanB{
public void validate(final Object input){
}
}