我一直在寻找一种比较我的对象的强大方法,我遇到了ObjectUtils,并且有一个潜在的疑问,它能否有效地比较它,因为我不知道它是如何在内部工作的,以及关于apache的文档关于这个的组织网站很少。
有人可以帮我解决这个问题吗?
编辑:
当我说比较时,我真的需要比较MYOBJ的相等性,其中MYOBJ是我定义的自定义对象,其中包含各种变量(所有这些变量都是原始数据类型,如int,long,float字符串,如果它们不为空,可以直接比较,但这可能会在将来发生变化。
我不确定BeanUtils.areEqual方法是否能够处理这样的情况以及如果我在MYOBJ中包含我自己的数据类型(非原型)会怎么样。
由于
答案 0 :(得分:4)
你的问题很模糊,我真的不知道你在说什么,所以我会进入几个方向。
“比较我的对象”可能意味着几件事。在Java中,这通常意味着将它们进行排序,即通过Comparable
/ Comparator
接口进行比较。虽然ObjectUtils
Comparator
Comparable
,但它不会帮助你。您需要的是自定义public class SomeBean implements Comparable<SomeBean>{
private String foo;
private int bar;
private List<String> baz;
public int compareTo(SomeBean other) {
return new CompareToBuilder()
.append(foo, other.foo)
.append(bar, other.bar)
.append(baz, other.baz)
.toComparison();
}
}
或要实现public class BeanUtilsTester {
public static class Foo{
private String foo="foo";
public String getFoo() {return foo;}
public void setFoo(String foo) {this.foo = foo;}
private Integer bar=123;
public Integer getBar() {return bar;}
public void setBar(Integer bar) {this.bar = bar;}
private List<String> squoggle=Arrays.asList("abc","def");
public List<String> getSquoggle() {return squoggle;}
public void setSquoggle(List<String> squoggle) {this.squoggle = squoggle;}
}
public static class Bar{
private String foo="bar";
public String getFoo() {return foo;}
public void setFoo(String foo) {this.foo = foo;}
private Integer bar=456;
public Integer getBar() {return bar;}
public void setBar(Integer bar) {this.bar = bar;}
private String[] fiddle=new String[]{"abc","def"};
public String[] getFiddle() {return fiddle;}
public void setFiddle(String[] fiddle) {this.fiddle = fiddle;}
}
public static void main(String[] args) throws Exception{
Foo foo = new Foo();
Bar bar = new Bar();
Map<String,Object> fooProps = BeanUtils.describe(foo);
Map<String,Object> barProps = BeanUtils.describe(bar);
fooProps.keySet().retainAll(barProps.keySet());
BeanUtils.populate(bar, fooProps);
assertEquals(foo.getFoo(),bar.getFoo());
assertEquals(foo.getBar(), bar.getBar());
}
}
的对象。 provide a null-safe compare method可以在一定程度上帮助您:
@Override
public boolean equals(Object obj) {
if (obj instanceof SomeBean) {
SomeBean other = (SomeBean) obj;
return new EqualsBuilder()
.append(foo, other.foo)
.append(bar, other.bar)
.append(baz, other.baz)
.isEquals();
}
return false;
}
另一方面,如果要比较不同对象类型的属性,那么您正在寻找完全错误的方向。请改为查看CompareToBuilder
。示例代码:
{{1}}
如果您只是想正确实现equals(),请查看Commons / BeanUtils:
{{1}}
答案 1 :(得分:0)
ObjectUtils可以很好地比较用户定义的对象。当然,您需要在任何您想要使用库函数进行比较的对象中实现Comparable接口。
答案 2 :(得分:0)
刚做了一个简单的测试
User user1 = new User();
User user2 = new User();
Assert.assertEquals(true,ObjectUtils.equals(user1, user2));
此处的测试显示为false。这不等于。
User user1 = new User();
User user2 = user1;
Assert.assertEquals(true,ObjectUtils.equals(user1, user2));
之前的测试显示为真。
我相信您希望像第一个测试一样进行测试而不更改用户定义的类。如果我是对的,你不能用这个库进行比较。
但是,如果在要比较的每个bean中实现compare()方法,我相信你可以使用它。