使用Java比较三个对象(语义)相等的最紧凑的代码是什么?我有一个业务规则,即对象必须是唯一的,即A 与B不同,A与C不同,B与C不同。
假设这些对象都属于同一个类,并且已正确覆盖equals
和hashCode
方法。一个轻微的皱纹是对象 C 可能是null
- 如果是这种情况,那么 A 和 B 必须与彼此。
我有一些代码但是我的口味有点像工作人员。
答案 0 :(得分:11)
由于OP说A
和B
永远不会为空,C
可能为空,请使用:
if(A.equals(B) || B.equals(C) || A.equals(C))
// not unique
并且,正如其他人已经建议的那样,您可以将其置于重用方法中。或者如果您需要更多重用,则使用通用方法; - )
请注意,在Java中,equals
的一个特性是,如果它的参数是null
,它不应该抛出,而是返回false。
答案 1 :(得分:6)
由于我从未在不使用Apache commons-lang的情况下启动Java项目,请尝试ObjectUtils.equals
(它是空的安全):
if (ObjectUtils.equals(a, b) || ObjectUtils.equals(b, c) || ObjectUtils.equals(a, c)) {
// error condition
}
将该逻辑放在通用方法中,你会做得更好。
虽然业务逻辑允许C为null,但在这种情况下,通常更好地进行防御性编码并假设A或B也可以为空。
答案 2 :(得分:4)
您可以在以下实用程序方法中抽象该方法:
public boolean allUnique(Object... objs) {
Set<Object> set = new HashSet<Object>();
for (Object o : objs)
set.add(o);
return set.size() == objs.length
}
对于小数字,该方法可能效果不佳(由于创建Set
和varargs数组的开销)。但是,它线性增长O(n)
,对于大值,它优于嵌套if
语句的二次增长。
答案 3 :(得分:4)
boolean areDistinct(Object a, Object b, Object c) {
return (!a.equals(b) &&
(c == null || (!c.equals(a) && !c.equals(b))));
}
答案 4 :(得分:0)
因为apache的common.lang3.ObjectUtils.equals()
是@Deprecated
。使用Objects.equals(aObj,bObj)
。如果您希望所有3个对象都相同,则应与&&
进行比较。如果您只希望 a&b,a&c或b&c 的一个组合相同,请使用||
。
/**
* Compare 3 objects of the same {@link TYPE}, if they are all equal using {@link Objects#equals(Object, Object)}.
*
* @param aObj the 1st object
* @param bObj the 2nd object
* @param cObj the 3th object
* @param <TYPE> the type of the objects
* @return true if the are all the same
*/
public static <TYPE> boolean equals(TYPE aObj, TYPE bObj, TYPE cObj) {
return Objects.equals(aObj, bObj) && Objects.equals(bObj, cObj) && Objects.equals(cObj, aObj);
}
答案 5 :(得分:-2)
package com.test;
public class Equality {
public static void main(String[] args) {
Boolean flag;
int[] arr={1,1,1,12};
flag=check_equal(arr);
System.out.println(flag);
}
public static Boolean check_equal(int[] arr){
Boolean flag=true;
outerloop:
for(int i=1; i< arr.length; i++)
{
for(int j=1; j< arr.length; j++){
if(arr[i]==arr[j]){
flag=true;
}
else{
flag=false;
break outerloop;
}
}
}
return flag;
}
}