【问题标题】:Refactoring: when visitor pattern can't be used to replace switch/instanceof重构:当访问者模式不能用于替换 switch/instanceof 时
【发布时间】: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


【解决方案1】:
DELETE delete = method.getAnnotation(DELETE.class);
if (delete != null) {
    ...
}
GET get = method.getAnnotation(GET.class);
if (get != null) {
    ...
}

【讨论】:

  • 嗯。在我看来,有很多注解是DELETE 的子类型,这不一定是注解本身。我不确定这是否可行。
  • 没错,可能就是这样。尽管我对此表示怀疑:这些注释看起来像标准的 JAX-RS 注释,并且 OP 使用注释名称(DELETE、GET)作为 HTTP 方法。所以我怀疑实际上是否有一个实现 DELETE 的 SomeDeleteAnnotation 类,因为没有名为“SomeDeleteAnnotation”的 HTTP 方法。 @user1769255:请澄清。
  • 有许多注释(每个 http 方法 1 个),但没有一个是另一种类型的子类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多