【问题标题】:Is there a more elegant way to iterate objects methods and test all those conditions Java有没有更优雅的方法来迭代对象方法并测试所有这些条件 Java
【发布时间】:2019-01-22 22:06:10
【问题描述】:

我有以下 Java 代码,我想将其最小化或以更简洁的方式编写。如果可行,您能帮帮我吗?

return( Objects.equals(obj1.getMeaning(), obj2.getMeaning())
        && Objects.equals(obj1.getModifies(), obj2.getModifies())
        && Objects.equals(obj1.getOriginalCommentString(), obj2.getOriginalCommentString())
        && Objects.equals(obj1.getReferences(), obj2.getReferences())
        && Objects.equals(obj1.getReturnDescription(), obj2.getReturnDescription())
        && Objects.equals(obj1.getReturnType(), obj2.getReturnType())
        && Objects.equals(obj1.getSuppressions(), obj2.getSuppressions())
        && Objects.equals(obj1.getTemplateTypeNames(), obj2.getTemplateTypeNames())
        && Objects.equals(obj1.getThisType(), obj2.getThisType())
        && Objects.equals(obj1.getThrownTypes(), obj2.getThrownTypes())
        && Objects.equals(obj1.getTypedefType(), obj2.getTypedefType())
        && Objects.equals(obj1.getType(), obj2.getType())
        && Objects.equals(obj1.getVersion(), obj2.getVersion())
        && Objects.equals(obj1.getVisibility(), obj2.getVisibility()))

以字符串的形式给出方法列表,然后创建一个映射函数来一一测试它们是否是一种好习惯。我读过Java中的反射,但我不是那么精通。

【问题讨论】:

  • 为什么不在你的类上实现equals()?
  • 用这个逻辑覆盖equals方法
  • 如果您决定实施equals,请先阅读:stackoverflow.com/questions/27581/…
  • 14个字段太多,分解成几个类试试
  • @AndrewTobilko 为什么 14 个字段太多了?

标签: java syntax


【解决方案1】:

你可以有这样的方法:

<T> boolean equals(T obj1, T obj2, Iterable<? extends Function<? super T, ?>> fns) {
  for (Function<? super T, ?> fn : fns) {
    if (!Objects.equals(fn.apply(obj1), fn.apply(obj2))) {
      return false;
    }
  }
  return true;
}

然后这样称呼它:

return equals(obj1, obj2, Arrays.asList(Thing::getMeaning, Thing::getModifies));

等等

【讨论】:

  • 这对我来说越来越重要。有什么办法可以将最后一个参数变成可变参数,这样就不需要调用 asList 了吗?
猜你喜欢
  • 2019-01-12
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
相关资源
最近更新 更多