【问题标题】:Java Interface Comparator static compareJava 接口比较器静态比较
【发布时间】:2011-07-26 14:29:08
【问题描述】:

int 比较(对象 o1,对象 o2) 比较它的两个参数的顺序。

对于比较 2 个对象 o1 和 o2 需要执行以下操作:

MyClass o1=new MyClass();
MyClass o2=new MyClass();

 if (o1.compare(o1,o2)>0) ......

为什么这个方法不是静态的? 如果方法是静态的,例如:

 if (MyClass.compare(o1,o2)>0) ....

【问题讨论】:

  • 乔恩的回答是正确的,但你的观点很好。从理论上讲,如果每个可比较的类都有一个静态的“比较”方法会很方便,但没有办法通过接口强制执行。

标签: java static comparator


【解决方案1】:

如果它是静态的,它怎么能被多态地调用呢? Comparator 的意义在于,您可以将 instance 传递给 sort... 之类的东西,然后它必须在比较器实例上调用 compare 方法

如果一个类能够将 自身 的一个实例与另一个实例进行比较,那么它应该实现 Comparable,所以你可以这样写:

if (o1.compareTo(o2))

【讨论】:

    【解决方案2】:

    您的问题表明对ComparableComparator缺乏了解。

    Comparator 能够比较其他两个对象;

    MyClass o1 = new MyClass();
    MyClass o2 = new MyClass();
    MyComparator c1 = new MyComparator();
    
    if (c1.compare(o1, o2) > 0) {
      ...
    }
    

    Comparable 可以与其他对象进行比较;

    MyClass o1 = new MyClass();
    MyClass o2 = new MyClass();
    
    if (o1.compareTo(o2)) > 0) {
      ...
    }
    

    比较一个比较器是非常罕见的,所以你的例子;

    if (o1.compare(o1, o2) > 0) {
      ...
    }
    

    真的没有意义。无论如何,回答,为什么compareTo() 不是静态的?基本上,Comparator 是一个接口,接口不能有静态方法。为什么?好吧,这对他们来说没有意义。接口是关于定义契约,但不提供实现。

    【讨论】:

      【解决方案3】:

      John 的答案很好,除非可以使用空指针。如果你想支持空指针,一个选项是在一些 Util 类上定义一个静态方法

      // null pointers first
      public static int compareTo(@Nullable Comparable v1, @Nullable Comparable v2)
      {
          return v1 == null ? (v2 == null ? 0 : -1) : v2 == null ? 1 : v1.compareTo(v2);
      }
      // null pointers last
      public static int compareTo(@Nullable Comparable v1, @Nullable Comparable v2)
      {
          return v1 == null ? (v2 == null ? 0 : 1) : v2 == null ? -1 : v1.compareTo(v2);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多