CompareTo当给定对象是null什么时,应该在方法中返回什么?
在MSDN库显示了一个例子1返回.但我本来希望抛出一个错误,因为比较null是不可能的.
我希望对这个答案有不同的看法.什么是最佳实践方法?
我一直在浏览Kinect传感器的一些Microsoft代码示例,并且偶然发现了以下行.
TimeSpan zeroDuration = TimeSpan.FromSeconds(0.0);
TimeSpan timeRemaining = ...;
if (timeRemaining.CompareTo(this.zeroDuration) > 0)
{
}
Run Code Online (Sandbox Code Playgroud)
我理解CompareTo()在排序这样的场景中有什么用处,但是为什么它会用在条件if()而不是更直接的方法中呢?
if (timeRemaining > this.zeroDuration)
{
}
Run Code Online (Sandbox Code Playgroud)
PS:如果是来自任何其他来源,我会带着一粒盐,但考虑到代码的一般质量,假设有一个原因
我很清楚的合同需求,确保hashCode与一致equals,并且equals与一致compareTo.但是,这在实践中经常被违反.是否有可以自动测试此一致性的工具,技术或库?
我怀疑不幸的是答案是"不",但能够对这种可以利用库调用或框架的东西进行单元测试而不是需要手动编写自定义测试是有用的.每个重要的案例.
如果目前还不清楚我所说的一致意思是,hashCode和equals我指的是以下几点:
如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果.
对于equals和compareTo我指的是以下几点:
当且仅当e1.compareTo(e2)== 0具有与c的每个e1和e2的e1.equals(e2)相同的布尔值时,C类的自然排序被认为与equals一致.
我想做这样的事情:
class Foo extends Ordered[Foo] {
val x
val y
val z
.
.
.
.
def compare(that: Foo) = {
val c0 = this.length compareTo that.length // primary comparison
lazy val c1 = this.x compareTo that.x // secondary comparison
lazy val c2 = this.y.size compareTo that.y.size // tertiary comparison
lazy val c3 = this.z.head compareTo that.z.head // final tie breaker
if (c0 != 0) c0 else if (c1 != 0) c1 else if (c2 != 0) c2 else if …Run Code Online (Sandbox Code Playgroud) 据说当输入参数为null时,compareTo()应抛出NullPointerException.但是,我正在实现一个需要将字段与String类型进行比较的类.这些字段不必是强制性的.我想知道在这种情况下,
1)当输入为空时我应该返回什么?任何非空字符串在字典上是大于还是小于null?
和
2)如果这被认为是不好的做法,是否有任何支持性论点?我应该强制用户使用空字符串吗?如果使用空字符串,那不会混淆字段不适用的情况和字段为空的情况吗?如果必须抛出异常,那么除了在手册中警告用户之外,我还能做什么?
编辑:我可能不会在这里清楚地表达自己,但在我正在实现的程序中,可以为null的字符串是所有字段或类,它们不应为null.换句话说,comparisonTo()使用的对象不能为null,只有它们的私有字段可以.所以在这种情况下,我相信如果我正确地实现了compareTo(),它就不会违反传递要求,因为具有空字段的类总是被认为是相同的.我是对的还是我在解释这个错误?
谢谢大家的答案!
我正在尝试为我的简单类生成一个hashCode()方法,但我没有得到它的任何地方.我将不胜感激任何帮助.我已经实现了equals()方法,如下所示,并且还想知道我是否需要实现compareTo()方法.我已经导入java.lang.Character来使用character.hashCode()但它似乎不起作用.
private class Coord{
private char row;
private char col;
public Coord(char x, char y){
row = x;
col = y;
}
public Coord(){};
public char getX(){
return row;
}
public char getY(){
return col;
}
public boolean equals(Object copy){
if(copy == null){
throw new NullPointerException("Object entered is empty");
}
else if(copy.getClass()!=this.getClass()){
throw new IllegalArgumentException("Object entered is not Coord");
}
else{
Coord copy2 = (Coord)copy;
if(copy2.row==this.row && copy2.col==this.col)
return true;
else
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢...
comparTo()方法给了我java.lang.Comparable转换错误..
public int …Run Code Online (Sandbox Code Playgroud) 在我的程序中,创建了一个fClasses固定长度[7]的对象数组,每个对象都是一个FClass包含3 Strings,an int和a的类int[].这些值从.txt文件中读取,并根据其值添加到数组的特定索引中int..txt文件中的条目较少,然后数组中有索引,因此数组最终看起来像这样:
fClasses[0] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
fClasses[1] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
fClasses[2] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
fClasses[3] null
fClasses[4] null
fClasses[5] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
fClasses[6] { str1, str2, str3, int1, int [] {1,2,3,4,5}}
Run Code Online (Sandbox Code Playgroud)
在稍后的节目,我需要的基础上平均的数组排序ints的int[].我有一个工作方法来返回这个,但当我尝试使用数组排序时compareTo,Arrays.sort我得到一个很长的错误列表,从这些开始:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) 一般问题:equals在Java中实现默认方法的覆盖时,我应该关注简单地利用已经实现的compareTo方法与将独立逻辑写入equals方法?我注意到有人在另一个问题中提到了foo.equals((String)null)返回false然后String.compareTo((String)null)抛出一个NullPointerException.是什么让这些不一致的结果成为理想的功
样品equals方法:
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof MyClass) {
MyClass msg = (MyClass)obj;
return this.compareTo(msg) == 0;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
编辑: 引用可比较文档
当且仅当e1.compareTo(e2)== 0与c1的每个e1和e2的e1.equals(e2)具有相同的布尔值时,C类的自然排序被认为与equals一致. null不是任何类的实例,并且e.compareTo(null)应该抛出NullPointerException,即使e.equals(null)返回false
编辑:
经过进一步审查后,我发现可比较文件还说明了以下内容:
实现者必须确保所有x和y的sgn(x.compareTo(y))== -sgn(y.compareTo(x)).(这意味着如果y.compareTo(x)抛出异常,x.compareTo(y)必须抛出异常.)
因为null.compareTo(x)显然会抛出一个NPE,所以也x.compareTo(null)应该抛出一个NPE.而对于平等,情况不一定如此.我对NPE的正确处理非常重视,所以我发现这个相对重要.
我在这里一无所知......
1: private static class ForeignKeyConstraint implements Comparable<ForeignKeyConstraint> {
2: String tableName;
3: String fkFieldName;
4:
5: public int compareTo(ForeignKeyConstraint o) {
6: if (this.tableName.compareTo(o.tableName) == 0) {
7: return this.fkFieldName.compareTo(o.fkFieldName);
8: }
9: return this.tableName.compareTo(o.tableName);
10: }
11: }
Run Code Online (Sandbox Code Playgroud)
在第6行,我从FindBugs得到: Bug: net.blabla.SqlFixer$ForeignKeyConstraint defines compareTo(SqlFixer$ForeignKeyConstraint) and uses Object.equals()
我不知道如何纠正这个问题.
引自Jos Java Bloch的Effective Java - Second Edition
对于浮点字段,请使用Double.compare或Float.compare代替关系运算符,这些运算符在应用于浮点值时不遵守compareTo的常规协定.
它没有详细说明为什么会这样.
所以,我的问题是:
当与浮点值一起使用时,关系运算符以何种方式不遵守compareTo的一般约定?