【问题标题】:Java Comparable: helper methods for isLessThan, isGreaterThan, isEqualToJava Comparable:isLessThan、isGreaterThan、isEqualTo 的辅助方法
【发布时间】:2017-03-06 04:23:54
【问题描述】:

对于实现 Comparable 接口的对象 a 和 b,我希望避免使用类似的代码

if (a.compareTo(b) > 0) {
    ...
}

相反,我正在寻找类似的辅助方法

if (a.isGreaterThan(b)) {
    ...
}

这对我很有帮助,因为我不必总是查找 compareTo(T o) 的返回值的定义:

返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。

真正有用的是 5 种不同的方法:

Instead of                  use potential helper method:

a.compareTo(b) < 0          a.isLessThan(b)
a.compareTo(b) <= 0         a.isLessOrEqualTo(b)
a.compareTo(b) == 0         a.isEqualTo(b)
a.compareTo(b) >= 0         a.isGreaterOrEqualTo(b)
a.compareTo(b) > 0          a.isGreaterThan(b)

在 JDK 或其他提供此类功能的库中是否有类似的辅助方法?

【问题讨论】:

  • 您确实意识到您需要编写的方法只需调用 compareTo 吗?像 boolean isLessThan(Comparable&lt;T&gt; a, T b){ return a.compareTo(b) &lt; 0; } 这样的东西(可能不正确,只是在没有检查的情况下写这个,但是静态泛型方法应该这样做
  • 这比看起来更容易出错,你知道 &lt; 总是做与 JLS 默认相同的事情,但库中的 isLessThan 可以做任何事情,除非你检查它到底做了什么.为什么要用不同库的所有奇怪之处而不是使用纯 Java 来填满你的脑袋?
  • +1 用于普通 Java,看起来新手想对所有东西都使用库,我在我的项目中几乎没有使用(几乎 ;))。 Java 已经很重了,不要为了删除一个简单的条件而添加一些库。
  • @Peter Lawrey 我会假设它使用 compareTo(T o) 方法,因为这些方法只会在 Comparables 上运行。例如如何“isLessThan(T o)”的实现仍然与 compareTo(T o) 方法中的相同。我更喜欢直接讲述故事的代码,而不必查找 compareTo() > 0 的含义。
  • @PeterLawrey 不,我强烈反对你的观点。当然&lt; 的含义与compareTo() &lt; 0 不同,就像== 的含义与equals() 不同(尽管&lt; 在对象上没有任何意义)。在这种情况下,它归结为您在 compareTo() 方法中实现的内容。但正如我所说:如果你在 Comparables 上进行操作,isLessThan 的含义是显而易见的。我会毫不犹豫地建议将以下默认方法包含在下一个 JDK 中。

标签: java methods helper comparable


【解决方案1】:

equals 方法适用于每个对象。其余的你必须自己创造。您可以创建一个具有这些方法的接口,这样所有的孩子都会拥有它们。

这应该可行:

public interface IComparable<T> extends Comparable<T> {

    boolean isLessThan(T other);

    boolean isLessOrEqualTo(T other);

    boolean isGreaterOrEqualTo(T other);

    boolean isGreaterThan(T other);

}

您可以为上述每个方法添加默认方法。像这样:

public interface IComparable<T> extends Comparable<T> {

    default boolean isLessThan(T other) {
        return compareTo(other) < 0;
    }

    default boolean isLessOrEqualTo(T other) {
        return compareTo(other) <= 0;
    }

    default boolean isGreaterOrEqualTo(T other) {
        return compareTo(other) >= 0;
    }

    default boolean isGreaterThan(T other) {
        return compareTo(other) > 0;
    }

}

【讨论】:

  • 您可以为每个方法添加default ;)
  • @PeterLawrey 编辑了答案。
  • 这是我的想法,但这需要继承,因为 Java 只允许一个超类,这可能会导致更多的复杂性。 PS : 自 Java 8 起默认可能在接口中,消除了这个问题 ;)
  • 我相信这是@PeterLawrey 的想法 ;) 这具有更灵活的优势,如果想要一个类成为 Observable 和 IComparable,我可以使用这个 :)
  • 假设(x.compareTo(y)==0) == (x.equals(y)) 是错误的,或者必须由接口明确说明。 Comparable 的 JavaDoc 说:“强烈推荐,但不严格要求 (x.compareTo(y)==0) == (x.equals(y))。”
【解决方案2】:

如果您记得的话,您不需要这些方法,只需将 compareTo 参数带到比较的右侧,进行心理替代就足够了,如下所示:

a.compareTo(b) < 0    ---->   a[.compareTo(...)] < b

由于它如此简单,因此通常没有人关心在库中是否有任何更好的比较形式。 如果你仍然坚持一些更易读的表达形式,你可以使用 Java 8 中的默认方法来扩展 Comparable 接口,如下所示:

public interface ComparableDSL<T> extends Comparable<T> {
    default boolean isLessThan(T that) { 
         return compareTo(that) < 0;
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2012-12-30
    相关资源
    最近更新 更多