Есть ли способ сделать сравнение динамически?Я использую отражение, чтобы сделать его динамическим, чтобы исключить поля, но его, чтобы замедлить - PullRequest
0 голосов
/ 27 сентября 2019

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

Это работает, но когда я тестировал его, он в 30 раз медленнее, чем метод равных (в котором я не могу исключить поля).

Есть ли способ сделать отражение быстрее?

Или вообще вообще плохо его использовать?И если так, есть ли способ сделать динамический, но общий вариант сравнения, чтобы я мог исключить поля?Я обычно использую miltiple comperators для подобных проблем, но я хочу сделать это более «легким», если это хорошая идея.

    private static boolean compareFieldsWithBlacklist(Class clazz, Object o1, Object o2, List<String> blackList)
            throws IllegalAccessException {

        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {

            if (!blackList.contains(field.getName())) {
                field.setAccessible(true);
                Object value1 = field.get(o1);
                Object value2 = field.get(o2);


                if (!value1.equals(value2))
                    return false;
            }

        }

        return true;
    }

Я также пытался создать экземпляр массива полей только один раз, когда я пытаюсь сравнить коллекцию.Но это только сделало это немного быстрее.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Отражение - плохая идея и медленная.Кроме того, наследование сделает его еще более громоздким.

Требуется равенство для некоторых значений полей.

Пусть в среде IDE будет создан метод equals, снимите флажки с полей, которые вы считаете неуместными.

Если он предназначен только для внешнего использования, извлеките его в Comparator или тому подобное.

Недостаток:

  • Поддержка изменений класса
  • Не является универсальным решением длявсе классы, но черный список тоже не очень общий
0 голосов
/ 27 сентября 2019

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

Более того, это вряд ли изменится;JVM работает так, как работает, и Java считает обратную совместимость настолько важной, что трудно понять, как она изменится, чтобы способствовать более быстрому размышлению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...