Общий алгоритм для генерации разности полей в двух бобах?

Вы можете использовать Windows Community Toolkit
. Пожалуйста, взгляните на SystemInformation Class

  • Пример проекта на github [112 ] UWP-SystemInfoCollector

9
задан matt b 23 February 2009 в 16:14
поделиться

4 ответа

Если бы Вы говорите о сравнении значений, я рассмотрел бы использование отражения и просто сравнения их поле полем.

Что-то вроде этого:


    Field[] oldFields = oldInstance.class.getDeclaredFields();
    Field[] newFields = newInstance.class.getDeclaredFields();
    StringBuilder changes = new StringBuilder();

    Arrays.sort(oldFields);
    Arrays.sort(newFields);

    int i = 0;
    for(Field f : oldFields)
    {
       if(!f.equals(newFields[i]))
       {
          changes.append(f.getName()).append(" has changed.\n");
       }
       i++;
    }

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

6
ответ дан 4 December 2019 в 13:50
поделиться

Отражение не поддерживает порядок Поля в следующем вызове: это - порядок safier массивы.

/*
*declarations of variables
*/

Arrays.sort(oldFields);//natural order - choice 1
Arrays.sort(newFields, new Ordinator());//custom Comparator - choice 2

/*
*logic of comparations between elements
*/

В выборе 2 можно решить логику сортировки (КАК, СОРТИРУЯ ЭЛЕМЕНТЫ) с внутренним классом Ordinator, расширяющий Компаратор.

PS код является проектом

2
ответ дан 4 December 2019 в 13:50
поделиться

Мы сделали что-то похожее с бобом utils, и это работало хорошо. Вещи рассмотреть: Вы выполняете развертку в объекты поля - Если Человек содержит Адрес и изменения адреса, Вы говорите, что адрес изменился или что address.postalCode изменился (мы делаем)? Вы возвращаете список propety имя, старое значение, новое значение от разности (мы делаем)? Как Вы хотите обработать даты - если все, о чем Вы заботитесь, является частью даты затем, Ваше сравнение должно проигнорировать время? Как сказать, который поля проигнорировать?

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

Что касается реализации, у нас просто есть статический util метод, который берет два боба и список свойств для сравнения и затем возвращает карту свойств к Паре, содержащей старое значение и новое значение. Затем каждый боб имеет a diff(Object o) метод, который называет статический util метод по мере необходимости.

3
ответ дан 4 December 2019 в 13:50
поделиться

Хорошие ответы выше.

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

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

Если существует условный тест, который делает блок полей релевантным или нет, Вы сериализируете/десериализовываете истинное или ложное значение условного теста и использование, что, чтобы решить, сериализировать ли и/или десериализовать затронутые поля. И это повторяется приятно.

Просто предложение.

1
ответ дан 4 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: