当参数字符串为 null 时,int compareTo() 应该返回什么?

据说当输入参数为 null 时,compareTo() 应抛出 NullPointerException。但是,我正在实现一个类,该类需要将字段与 String 类型进行比较。这些字段不必是必填字段。我想知道在这种情况下,

1) 当输入为空时,我应该返回什么?任何非空字符串在字典上是否应大于或小于 null?

2)如果这被认为是不好的做法,是否有任何支持论据?我是否应该强制用户改用空字符串?如果使用空字符串,这不会混淆字段不适用的情况和字段为空的情况吗?如果必须抛出异常,那么除了在手册中警告用户之外,我还能做些什么呢?

编辑:我可能不会在这里清楚地表达自己,但是在我正在实现的程序中,可能为null的字符串都是字段或类,不应该是null。换句话说,比较到()使用的对象不能为空,只是它们的私有字段可以是空的。因此,在这种情况下,我相信如果我正确实现compareTo(),它不会违反传递要求,因为具有空字段的类将被视为始终相同。我是对的,还是我解释错了?

谢谢大家的回答!


答案 1

来自 javadoc for Comparable

请注意,null 不是任何类的实例,e.compareTo(null) 应该抛出 NullPointerException,即使 e.equals(null) 返回 false。


答案 2

是的,允许实例字段没有问题 - 只需确保其排序顺序已定义即可。最自然的是把它放在所有真正的字符串之前或之后,但你可以在这里做任何事情,只是坚持不懈地做。(例如,您可以像 .) 一样进行排序。nullnull"null"

下面是单个成员的示例实现:

class Example implements Comparable<Example> {

   @Nullable
   private String member;

   // TODO: getter, setter, constructor, ...

   public int compareTo(Example that) {
      if(this.member == null)
         if(that.member == null)
            return 0; //equal
         else
            return -1; // null is before other strings
       else // this.member != null
         if(that.member == null)
            return 1;  // all other strings are after null
         else
            return this.member.compareTo(that.member);
   }
}

请注意,Comparable.compareTo() 的规范只有一个约束(其行为应该就像 ,即抛出 NullPointerException),而不是关于如何处理字段(它根本没有提到字段,所以一个类可以返回它想要的任何东西,只要确保反对称性、自反性和传递性)。o.compareTo(null)- null.compareTo(o)null