Наличие нулевых безопасных проверок с использованием класса org.apache.commons.ObjectUtil для пользовательских объектов - PullRequest
0 голосов
/ 24 июня 2011

Я искал надежный способ сравнения своих объектов, я наткнулся на ObjectUtils и сразу же усомнился в том, что он сможет сравнить это эффективно или нет, так как я не знаю, как это работает внутри, и документацию по apache. на сайте об этом мало.

Может кто-нибудь помочь мне с этим ??

EDIT:

Когда я говорю сравнить, все, что мне действительно нужно, это сравнить для равенства MYOBJ, где MYOBJ - это определенный мной пользовательский объект, в котором есть различные переменные (все эти переменные являются примитивными типами данных, такими как int, long, float Строка, которую можно сравнивать простым способом, если она не равна нулю), но это может измениться в будущем.

Я не был уверен, что метод BeanUtils.areEqual сможет обработать такой случай, и что, если я включу свои собственные типы данных (не-примитивы) в этот MYOBJ.

Спасибо

Ответы [ 3 ]

4 голосов
/ 24 июня 2011

Ваш вопрос очень расплывчатый, я не знаю, о чем вы говорите, поэтому я пойду в нескольких направлениях.

«сравнить мои объекты» может означать несколько вещей. В Java это обычно означает сравнение их для сортировки, то есть через интерфейсы Comparable / Comparator. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ObjectUtils . Вам нужен либо пользовательский Comparator, либо ваши объекты для реализации Comparable. CompareToBuilder может в определенной степени помочь вам обоим:

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();
    }

}

Если, с другой стороны, вы хотите сравнить свойства различных типов объектов, то вы смотрите в совершенно неверном направлении. Взгляните на Commons / BeanUtils . Пример кода:

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());
    }

}

И если вы просто хотите правильно реализовать equals (), посмотрите на EqualsBuilder:

@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;
}
0 голосов
/ 24 июня 2011

Только что сделал простой тест

User user1 = new User();
User user2 = new User();
Assert.assertEquals(true,ObjectUtils.equals(user1, user2)); 

Тест здесь показывает ложь. Это не равно.

User user1 = new User();
User user2 = user1;
Assert.assertEquals(true,ObjectUtils.equals(user1, user2));

Предыдущий тест показывает true.

Я полагаю, что вы хотите протестировать аналогично первому тесту без изменения пользовательского класса . Если я прав, вы не можете использовать эту библиотеку для сравнения.

Однако, если вы реализуете метод сравнения () в каждом bean-компоненте, который вы хотите сравнить, я думаю, вы сможете использовать это.

0 голосов
/ 24 июня 2011

ObjectUtils будет прекрасно работать при сравнении пользовательских объектов.Конечно, вам нужно реализовать интерфейс Comparable в любом объекте, который вы хотите сравнить, используя библиотечные функции.

...