Отличный способ обнулить все поля объекта - PullRequest
0 голосов
/ 29 марта 2019

У меня есть простой класс pojo с 20+ полями и чувствительным к производительности фрагментом кода. Чтобы уменьшить выделения, я повторно использую тот же экземпляр класса. Как очистить объект наиболее производительным (небезопасным) способом?

Если я не ошибаюсь, поля хранятся в виде непрерывной последовательности байтов, поэтому я ожидаю, что должно быть что-то такое же быстрое, как System.arraycopy.

Сам класс является частью стабильного API и не подлежит изменению.

Ответы [ 3 ]

1 голос
/ 30 марта 2019

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

Простое задание полей одно за другим уже достаточно оптимизировано.Теоретически, можно очистить объект немного быстрее с помощью инструкций SIMD, но в Java нет способа сделать это.

Существует метод Unsafe.setMemory, но он работает только для примитивных массивов.,Это ограничение вполне понятно: недопустимо очищать объект со ссылочными полями с помощью массовой операции, потому что разные GC могут потребовать отслеживать обновления для справочных полей по отдельности.

Если вы посмотрите на Arrays.fillРеализация , она использует простой цикл, который хранит элементы один за другим, и метод не является даже JVM-экземпляром по вышеуказанным причинам.

0 голосов
/ 29 марта 2019

Предполагая, что вы хотите обнулить все поля одновременно, самый простой способ - создать внутренний объект, содержащий все значения. Пусть ваши геттеры и сеттеры будут легкими обертками вокруг полей этого объекта. Затем вместо того, чтобы аннулировать поля по отдельности, просто обновите внутренний объект новым экземпляром, где поля начинаются с нуля.

0 голосов
/ 29 марта 2019

Как уже упоминалось, причины этого весьма сомнительны.

Мы не хотим использовать отражение, поскольку известно, что оно довольно медленное.Рассматриваете ли вы использование библиотеки манипулирования байт-кодом Java (Javassist, Bytebuddy, ..), которая позволяет вам модифицировать класс Pojo и добавить дополнительный метод, который будет напрямую устанавливать для всех полей значение null .

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