Сравнение JavaBeans

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

Приветствия
Томас

Ответ 1

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 увеличит шансы на получение совпадений.

Вам нужно импортировать в свой проект следующие банки: commons-logging-version.jar, commons-beanutils-version.jar, commons-beanutils-core-version.jar, commons-beanutils- bean -collections- version.jar, commons-collections-version.jar.

Файлы включены внутри commons-logging, commons- beanutils и коллекторы коллекций API.

Ответ 2

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

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

Если у нас есть java.util.List Java beans типа Person -, где Person имеет возраст, который Integer, имя, которое является String, и страна, в которой находится страна bean (который сам имеет имя String) - мы можем сортировать его в любом случае с помощью 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.