我知道Java枚举被编译为具有私有构造函数和一堆公共静态成员的类.当比较给定枚举的两个成员时,我总是使用.equals(),例如
public useEnums(SomeEnum a)
{
if(a.equals(SomeEnum.SOME_ENUM_VALUE))
{
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我刚刚遇到一些使用equals运算符==而不是.equals()的代码:
public useEnums2(SomeEnum a)
{
if(a == SomeEnum.SOME_ENUM_VALUE)
{
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个运营商?
Comparable合同规定e.compareTo(null)必须抛出NullPointerException.
来自API:
请注意,这
null不是任何类的实例,并且e.compareTo(null)应该抛出一个NullPointerException偶数e.equals(null)返回false.
另一方面,ComparatorAPI没有提及比较时需要发生的事情null.考虑以下尝试采用a的泛型方法Comparable,并Comparator为其null作为最小元素返回.
static <T extends Comparable<? super T>> Comparator<T> nullComparableComparator() {
return new Comparator<T>() {
@Override public int compare(T el1, T el2) {
return
el1 == null ? -1 :
el2 == null ? +1 :
el1.compareTo(el2);
}
};
}
Run Code Online (Sandbox Code Playgroud)
这允许我们执行以下操作:
List<Integer> numbers = new ArrayList<Integer>(
Arrays.asList(3, 2, 1, null, …Run Code Online (Sandbox Code Playgroud) 我们有一个OO代码库,在很多情况下hashcode()并且equals()根本不起作用,主要是由于以下原因:
除非您愿意放弃面向对象抽象的好处,否则无法扩展可实例化的类并在保留equals合同的同时添加值组件.
这是Joshua Bloch撰写的"Effective Java"的引用,在这篇伟大的Artima文章中有关于该主题的更多内容:
http://www.artima.com/lejava/articles/equality.html
我们完全没问题,这不是这个问题的意思.
问题是:看到事实上,在某些情况下你无法满足equals()合同,什么是自动制作hashcode()和equals()抛出UnsupportedOperationException 的干净方法?
注释会起作用吗?我正在考虑这样的事情@NotNull:每次@NotNull合同违规都会自动抛出异常,除了用你的参数/返回值注释之外别无他法@NotNull.
它很方便,因为它是8个字符("@NotNull")而不是不断重复相同的验证/抛出异常代码.
在我关注的情况下,在每个hashCode()/equals()没有意义的实现中,我们总是重复同样的事情:
@Override
public int hashCode() {
throw new UnsupportedOperationException( "contract violation: calling hashCode() on such an object makes no sense" );
}
@Override
public boolean equals( Object o ) {
throw new UnsupportedOperationException( "contract violation: calling equals() on such an object makes no sense" );
}
Run Code Online (Sandbox Code Playgroud)
然而,这很容易出错:我们可能会忘记剪切/粘贴此内容,这可能会导致用户滥用此类对象(例如,尝试将它们放入默认的Java集合中).
或者,如果无法创建注释来创建此行为,AOP是否有效?
有趣的是,真正的问题是Java层次结构的存在hashCode()和 …
我在我的一个类中有一个函数,它将自己与同一个类的另一个实例进行比较 - 并找出哪些变量不同.这是为了最大限度地减少主数据库的网络负载(仅上传需要上传的数据,而不是上传整个对象).
为此,我一直在尝试使用该object.equals()函数来比较两个对象.
我很快就发现object.equals()它没有处理null,在看完这个问题之后,我理解为什么.
所以我破坏的代码示例如下:
public class MyObject {
String myString;
String myString2;
public String getChangedVars(MyObject comparisonObj) {
ArrayList<String> changedVars = new ArrayList<String>();
if (!this.myString.equals(comparisonObj.myString))
changedVars.add("myString");
if (!this.myString2.equals(comparisonObj.myString2))
changedVars.add("myString2");
return changedVars.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 基于被比较的变量中的任何一个可能为空,比较两个变量同时避免一个变量的简单方法是NullPointerException什么?
编辑:简单地检查两个对象上的null首先不能正常工作,因为我仍然希望比较对象是否有引用.例如,如果一个项目是null,而另一个项目不是,我希望这个解析为true,因为变量已经改变.
平等应该是对称的,对吗?
Object someObject = new Object();
Object NULL = null;
NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false
Run Code Online (Sandbox Code Playgroud)
不让第二种形式抛出 a的理由是什么NullPointerException?
我正在重构一些旧的代码来使用enum's而不是String常量.我检讨我的代码时,我注意到,相比enum于String将不会抛出异常.我无法删除旧常量,因为其他项目仍在使用它们.
我不能覆盖等于因为JLS特别禁止这个:
Enum中的equals方法是一个最终方法,它只在其参数上调用super.equals并返回结果,从而执行身份比较.
代码如下所示:
public enum Gender{
MALE,
FEMALE
}
// Constants for genders
public static final String MALE = "Male";
public static final String FEMALE = "Female";
//following are obviously false
MALE.equals(Gender.MALE)
Gender.MALE.equals(MALE)
Run Code Online (Sandbox Code Playgroud)
对于常规对象,我可以覆盖equals并抛出异常,但对于我的示例,它将返回false.还有一个类似getGender的方法,它返回一个字符串,现在返回一个枚举,所以我可以错过一些地方,并将字符串与枚举进行比较
这很容易出错.FindBugs也没有报告任何错误.无论如何我可以防止这种情况吗?
我在这段代码中遇到了一个奇怪的问题,当我使用第一个if条件执行代码时,它一切正常并且被视为已被删除.但是,当我评论if语句并使用另一个if条件(已经评论过的那个)时,它会给出NPE.getUserIP()和getPhoneNumber()都只是私有字符串的普通getter.并且两个值都是由普通的setter设置的.所以任何想法为什么会发生这种情况?谢谢.
public void sendBroadcast(final String broadcast) {
System.out.println("entered sendBroadcast");
String fullPeep=broadcast;
System.out.println("fullPeep: "+fullPeep);
String array[] = fullPeep.split("<!!>");
for(User tempUser: friends)
{
if(tempUser.getUserIP().equals(this.getUserIP()))
{
System.out.println("tempuser:" +tempUser.getPhoneNumber() + " user: "+array[1] );
//if(tempUser.getPhoneNumber().equals(array[1]))
//{
System.out.println("tempuser:" +tempUser.getPhoneNumber() + " user: "+array[1] );
System.out.println("if statemnt of broadcast method");
try {
DataOutputStream out2= new DataOutputStream(socket.getOutputStream());
out2=tempUser.getUserDataOutputStream();
out2.writeUTF(fullPeep+"\n");
out2.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
//}
}
}
Exception in thread "Thread-6" java.lang.NullPointerException
at User.sendBroadcast(User.java:180)
at Server$ServerThread.run(Server.java:394)
Run Code Online (Sandbox Code Playgroud)
编辑:我弄清楚导致异常的原因以及为什么tempUser.getPhoneNumber()在某些时候返回null.谢谢大家.
java ×7
enums ×2
equals ×2
null ×2
comparable ×1
comparator ×1
findbugs ×1
generics ×1
symmetric ×1