很抱歉,您使用的方法似乎已被广泛接受。我在 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)
方法来决定是否使用它的转换例程。
实际上:您的请求让我想起的是 Prototype (Javascript) 中的Try.these(a,b,c)方法。
您的案例的使用示例:
假设您有一些具有验证方法的 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){
}
}