Сравнение JavaBeans - PullRequest
       10

Сравнение JavaBeans

10 голосов
/ 13 января 2009

Кто-нибудь знает о бесплатной библиотеке с открытым исходным кодом (служебный класс), которая позволяет сравнивать два экземпляра одного Java-компонента и возвращать список / массив свойств, значения которых различны в этих двух экземплярах? Пожалуйста, оставьте небольшой образец.

Приветствия
Tomas

Ответы [ 2 ]

8 голосов
/ 13 января 2009

BeanComparator общих Apache - это то, что вы ищете.

Обновление . Простой пример, который сравнивает JavaBeans с одним свойством (сравнение выполняется только с одним свойством, вы должны создать столько BeanComparators, сколько свойств вы хотите сопоставить).

import org.apache.commons.beanutils.BeanComparator;

public class TestBeanComparator
{
    public TestBeanComparator()
    {
    }

    public class TestBean
    {
        int value;

        public TestBean()
        {
        }

        public int getValue()
        {
            return value;
        }

        public void setValue(int value)
        {
            this.value = value;
        }
    }

    public static void main(String[] args)
    {
        TestBeanComparator tbc = new TestBeanComparator();

        tbc.go();
    }

    public void go()
    {
        TestBean tbs [] = new TestBean[10];

        for (int i = 0; i < tbs.length; i++)
        {
            tbs[i] = new TestBeanComparator.TestBean();
            tbs[i].setValue((int) (Math.random() * 10));

            System.out.println("TestBean["+i+"] = " + tbs[i].getValue());
        }

        BeanComparator bc = new BeanComparator("value");

        System.out.println("");
        System.out.println("Value to match: " + tbs[0].getValue());
        for (int i = 1; i < tbs.length; i++)
        {
            if(bc.compare(tbs[i], tbs[0]) == 0)
            {
               System.out.println("Match found in bean "+ i); 
            }
        }
    }
}

После некоторых тестов один результат успешен. Это вывод:

TestBean[0] = 0
TestBean[1] = 4
TestBean[2] = 0
TestBean[3] = 2
TestBean[4] = 7
TestBean[5] = 3
TestBean[6] = 0
TestBean[7] = 3
TestBean[8] = 7
TestBean[9] = 3

Value to match: 0
Match found in bean 2
Match found in bean 6

Очевидно, что увеличение размера массива TestBean увеличит шансы на получение совпадений.

Вам необходимо импортировать в ваш проект следующие jar-файлы: commons-logging- версия .jar, commons-beanutils- версия .jar, commons-beanutils-core- версия .jar, commons-beanutils-bean-collection- версия .jar, commons-collection- версия .jar.

Файлы включены в commons-logging , commons-beanutils и commons-collection API.

6 голосов
/ 13 января 2009

BeanComparator может использоваться для сортировки коллекции .
Это реализация Comparator, которая сравнивает bean-компоненты на основе значения общего свойства.

BeanComparators - это общие компараторы, которые могут работать с любым Java-бином. С хорошей системой отражения базовых компонентов они могут обрабатывать объекты со свойствами, массивами, коллекциями и картами компонентов.

Если у нас есть java.util.List Java Beans типа Person - где Person имеет возраст, равный Integer, имя, которое является строкой, и страну, которая является компонентом страны (которая сама имеет строковое имя) - мы можем отсортировать его так, как захотим, с BeanComparator.

Некоторые примеры :

List people = ...; // list of Person objects

//sort by age
BeanComparator comp = new BeanComparator("age");
Collections.sort(list, comp);

//sort by name
BeanComparator comp = new BeanComparator("name");
Collections.sort(list, comp);

//sort by country name
BeanComparator comp = new BeanComparator("country.name");
Collections.sort(list, comp);

Нет необходимости писать PersonComparator с большим количеством опций для сортировки. Вместо этого один класс BeanComparator позаботится обо всем этом.


Здесь вы найдете полный пример со следующим сценарием:

Если вы внедрили компаратор для динамического сравнения свойств (например, подумайте о сортировке строк в таблице на веб-странице на основе того, какой столбец выбирает клиент), то вы можете отложить создание компаратора, пока не узнаете, какое свойство имело был выбран для сортировки.

Вот где BeanComparator действительно сияет. Огромное количество кода, которое вы обычно пишете для реализации этого поведения, сокращается до нескольких строк при использовании BeanComparator.

...