使用org.apache.commons.ObjectUtil类进行空安全检查以获取自定义对象

时间:2011-06-24 10:34:39

标签: java apache-commons equality

我一直在寻找一种比较我的对象的强大方法,我遇到了ObjectUtils,并且有一个潜在的疑问,它能否有效地比较它,因为我不知道它是如何在内部工作的,以及关于apache的文档关于这个的组织网站很少。

有人可以帮我解决这个问题吗?

编辑:

当我说比较时,我真的需要比较MYOBJ的相等性,其中MYOBJ是我定义的自定义对象,其中包含各种变量(所有这些变量都是原始数据类型,如int,long,float字符串,如果它们不为空,可以直接比较,但这可能会在将来发生变化。

我不确定BeanUtils.areEqual方法是否能够处理这样的情况以及如果我在MYOBJ中包含我自己的数据类型(非原型)会怎么样。

由于

3 个答案:

答案 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()方法,我相信你可以使用它。