|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Подскажите, как вы делаете ленивую инициализацию поля класса, если NULL может быть валидным значением? Классический пример: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
При Код: java 1. 2.
метод compute() будет выполнен 2 раза. Как вы решаете эту проблему? Нужно для Java 8. 1) Использовать доп флаг? Некрасиво. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
2) Optional - isPresent не подходит => не работает Код: java 1. 2. 3. 4. 5. 6. 7.
3) Optional антипаттерн Код: java 1. 2. 3. 4. 5. 6. 7.
Скажите что-нибудь! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 09:54 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
java.util.EnumMap использует для подобного специальный объект: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Все проверки с value - через maskNull()/unmaskNull(). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 10:13 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Alexander A. Sak, Я так понимаю, что введение спец объекта схоже с использованием флага: Код: java 1. 2. 3. 4. 5. 6. 7. 8.
Такой смысл? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 10:27 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, Можно не смотреть так мелко и не экономить спички. Ленивость делать не для поля, а для класса. Тогда флаг инициализации уместен. Ну или айди всегда не null. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 10:33 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, PetroNotC Sharp Ленивость делать не для поля, а для класса. В моем случае - пишу некий "ютилити класс", который создает кучу тяжелых объектов разных типов (через обращение к БД, вызов сервисов, т.д. - короче затратная по времени инициализация). Изменять удаленные методы не могу (чтобы возвращались не NULL). Объекты используются не все и не всегда (в зависимости от условий)-> иницализация нужна ленивая. В таком контексте делать весь класс ленивым, наверное, нет смысла... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 10:43 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K Alexander A. Sak, Я так понимаю, что введение спец объекта схоже с использованием флага: Код: java 1. 2. 3. 4. 5. 6. 7. 8.
Такой смысл? Типа того. Только в этом примере наверное getValue() будет возвращать null, если compute() вернет "NULL". Или проверку делать if (aValue == NULLABLE) или вообще делать без Optional, а в NULLABLE поместить какую-то строку, которой заведомо не будет получаться в compute(). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 10:44 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, Тогда это специализированный класс и делай флаги хоть на каждое поле. Можно даже кеш запомнить или дату обновления. Не усложняй. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 10:46 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, PetroNotC Sharp Тогда это специализированный класс и делай флаги хоть на каждое поле. Можно даже кеш запомнить или дату обновления. Сейчас так и сделал на флагах. Но каждый раз, как смотрю на класс с мусорными флагами, начинает коробить ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 10:50 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K PetroNotC Sharp, PetroNotC Sharp Ленивость делать не для поля, а для класса. В моем случае - пишу некий "ютилити класс", который создает кучу тяжелых объектов разных типов (через обращение к БД, вызов сервисов, т.д. - короче затратная по времени инициализация). Изменять удаленные методы не могу (чтобы возвращались не NULL). Объекты используются не все и не всегда (в зависимости от условий)-> иницализация нужна ленивая. В таком контексте делать весь класс ленивым, наверное, нет смысла... 1 ты написал что пишешь утилитный класс. Ну и что? 2. Ты написал что сервисы возвращают null. Так бывает. 3. "объекты используются не всегда".... Ну а кто против? Мы же о ленивой говорим. То есть где ответ на мой вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 10:58 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp То есть где ответ на мой вопрос? Ну тогда я не понял, что ты имеешь под PetroNotC Sharp Vladmir K, Ленивость делать не для поля, а для класса. ? Обернуть каждое поле в класс? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 11:09 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, Чтобы ответить надо знать задачу выше уровнем. Ты пишешь свой ОРМ вместо хибера? То есть ты без маппинга рожаешь/формируешь класс из бд по полям. Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 11:11 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, Напиши код использования твоегo класса MyUtils() ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 11:13 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, Код: java 1.
<:o) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 11:39 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Напиши код использования твоегo класса MyUtils() Хех... ну если сильно упрощенно. Допустим, формируем некий Payload POJO класс для последующей сериализации в JSON (проверки на NULL и иже с ним опущены для упрощения) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 11:41 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, Так. ОРМ не используем. А это? 5 января 2019 г. - финальная версия JSON-B API 1.0.1 http://json-b.net/ авторJSON-B - это стандартный уровень привязки для преобразования объектов Java в сообщения JSON. Он определяет алгоритм отображения по умолчанию для преобразования существующих классов Java в JSON, а также позволяет разработчикам настраивать процесс отображения с помощью аннотаций Java. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 12:23 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K PetroNotC Sharp Напиши код использования твоегo класса MyUtils() Хех... ну если сильно упрощенно. Допустим, формируем некий Payload POJO класс для последующей сериализации в JSON (проверки на NULL и иже с ним опущены для упрощения) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Значит, по логике, у тебя уже 2 ленивых класса а не метода Invoice, BillOfLading В них сделать по флагу о том что из бд взяли все поля. ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 12:45 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Тогда сам этот код выше останется без изменений. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 12:47 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Ну и можно добавить версию как в хибере. При любом запросе, объект лезет в бд и сравнивает версию со своей. Если устарел, то переобновится весь. Хотя это более затратно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 12:51 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, PetroNotC Sharp Так. ОРМ не используем. А на что это влияет? Внутри сервисов (например с помощью которого Invoice возвращается) используется, конечно. PetroNotC Sharp JSON-B API Jackson было решено использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 13:02 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K А на что это влияет? Внутри сервисов (например с помощью которого Invoice возвращается) используется, конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 13:06 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, При rest часто сущности как они есть выставляем наружу в http/json. Возможно у вас комбинированная Бизнес сущность из трех entity сущностей в бд. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 13:08 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Значит, по логике, у тебя уже 2 ленивых класса а не метода Invoice, BillOfLading Объекты этих типов возвращаются сервисами. Их менять нельзя. Т.е., если следовать твоей рекомендации, то мне нужно писать для них обертки. Ход мысли понятен. Спасибо. PetroNotC Sharp Ну и можно добавить версию как в хибере. При любом запросе, объект лезет в бд и сравнивает версию со своей. Если устарел, то переобновится весь. Хотя это более затратно. Можно, это понятно. Но в моем случае, просто избыточно: Время жизни Util класса ограничено, фактически, вызовом основного метода build(). Проблема, что внутри метода build() постоянно дергаются тяжелые объекты, которые я хочу инициировать 1 раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 13:14 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Vladmir K А на что это влияет? Внутри сервисов (например с помощью которого Invoice возвращается) используется, конечно. Если бы можно, то и вопроса бы не было :) Система "сторонняя". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 13:16 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K Объекты этих типов возвращаются сервисами. Их менять нельзя. Т.е., если следовать твоей рекомендации, то мне нужно писать для них обертки. Ход мысли понятен. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 13:22 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K PetroNotC Sharp, PetroNotC Sharp Ленивость делать не для поля, а для класса. В моем случае - пишу некий "ютилити класс", который создает кучу тяжелых объектов разных типов (через обращение к БД, вызов сервисов, т.д. - короче затратная по времени инициализация). Изменять удаленные методы не могу (чтобы возвращались не NULL). Объекты используются не все и не всегда (в зависимости от условий)-> иницализация нужна ленивая. В таком контексте делать весь класс ленивым, наверное, нет смысла... По смыслу все твои объекты - ленивые синглтоны. Посмотри еще в сторону Scala. Там есть lazy val. Кажется это то что ты ищешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 16:16 |
|
|
start [/forum/topic.php?fid=59&msg=39927849&tid=2120897]: |
0ms |
get settings: |
24ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
455ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 582ms |
0 / 0 |