【发布时间】:2016-01-28 23:31:57
【问题描述】:
我正在尝试使用 instanceof 对一段代码进行一些重构以确定类型。我认为子类型化/多态性在这种情况下不起作用(即使在这种情况下它太过分了)并且访问者模式在这里不起作用,因为我没有可能向注解。有没有其他方法可以使这种代码更简洁/更具可读性?
for (Annotation annotation : method.getAnnotations()) {
if (annotation instanceof DELETE) {
setHttpMethod(annotation.annotationType().getSimpleName(), false);
parsePath(((DELETE) annotation).value());
} else if (annotation instanceof GET) {
setHttpMethod(annotation.annotationType().getSimpleName(), false);
parsePath(((GET) annotation).value());....
DELETE 和 GET 看起来像这样
public @interface DELETE {
String value() default "";
}
public @interface GET {
String value() default "";
}
使用示例:
class Example {
@DELETE("value")
Response method() {
...
}
}
【问题讨论】:
-
你可以使用反射来调用accept
-
您能否提供更多详细信息?我目前发现在不详细了解您的情况的情况下提出任何建议有点困难。什么是
DELETE,什么是GET,有没有应该不考虑的注解等等? -
我不太了解注解,但如果
annotation instanceof DELETE为真那么((DELETE) annotation)是多余的向上转换。在这种情况下,if块的内部在这两种情况下都只是setHttpMethod(annotation.annotationType().getSimpleName(), false); parsePath(annotation.value());。身体会改变吗? -
@MiserableVariable 不,那是向下转换。 Annotation 中没有 value() 方法。 String 是 Object 的一个实例。如果你有一个 Object 类型的变量 o,并且检查了
o instanceof String,你就不能做o.substring()。你需要做((String) o).substring()。 -
@MiserableVariable 如果 java 支持注解继承,可能会这样做,但这在 java 中不可用
标签: java design-patterns refactoring visitor-pattern