|
Ленивая инициализация при валидном значении 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 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
mayton По смыслу все твои объекты - ленивые синглтоны Да, глядя на приведенные примеры, кажется что они синглтоны. Но на самом деле они живут в пределах вызова метода (в моем примере build()). Моя цель была - элегантно их закэшировать. mayton Посмотри еще в сторону Scala. Там есть lazy val. Кажется это то что ты ищешь. Да! именно то, что ищу! Но на JAVA. Scala не могу по полиси :( ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:02 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K Объекты этих типов возвращаются сервисами. Их менять нельзя. Vladmir K Моя цель была - элегантно их закэшировать. Это как? У тебя все равно при отдаче сервиса, есть десиреализованный объект класса в оперативке на твое стороне. Ты хоть 200 раз вызывай его методы. Никакого падения производительности не будет. И кешировать не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:24 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Фреймворки (Spring) это давно решили. У них бины - ленивые и активизируются при первом обращении. Вобщем я не очень понимаю с чем борется автор. Возможно с языком программирования или с попыткой где-то схитрить и писать поменьше кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:29 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
mayton Вобщем я не очень понимаю с чем борется автор. Возможно с языком программирования или с попыткой где-то схитрить и писать поменьше кода. Именно - схитрить :) Просто был удивлен, что вроде бы простая задача не покрыта Java SE ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:00 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K mayton Вобщем я не очень понимаю с чем борется автор. Возможно с языком программирования или с попыткой где-то схитрить и писать поменьше кода. Именно - схитрить :) Просто был удивлен, что вроде бы простая задача не покрыта Java SE Смысл задачи отсутствует. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:07 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Vladmir K пропущено... Именно - схитрить :) Просто был удивлен, что вроде бы простая задача не покрыта Java SE Смысл задачи отсутствует. Ага, поэтому lazy val в Скала сделали фана ради! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:27 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K Ага, поэтому lazy val в Скала сделали фана ради! Если тебе без скалы трудно в java, значит что то лишнее задумал. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:38 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Vladmir K Ага, поэтому lazy val в Скала сделали фана ради! Если тебе без скалы трудно в java, значит что то лишнее задумал. для чего же для другого? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:38 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
andreykaT для чего же для другого? Ты бы еще с JS горевал, почему нет многих фич в java. Давай наоборот. Ты как ТС придумай юз кейс со своей ленивостью вычислений. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 14:44 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K PetroNotC Sharp пропущено... для хитростей без смысла никто не делает SE))) Смысл задачи отсутствует. Ага, поэтому lazy val в Скала сделали фана ради! Ты не в теме. Ленивые вычисления идут не от фана а от работ математика Хаскелла Карри. Ленивость в ФП - это не просто фича а это база для построения других структур наподобие бесконечных "рекурсивных" списков которые без ленивости просто невозможно реализовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 16:22 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
mayton Vladmir K пропущено... Ага, поэтому lazy val в Скала сделали фана ради! Ты не в теме. Ленивые вычисления идут не от фана а от работ математика Хаскелла Карри. Ленивость в ФП - это не просто фича а это база для построения других структур наподобие бесконечных "рекурсивных" списков которые без ленивости просто невозможно реализовать. Огонь! З.Ы. Но ведь понятно, что про фан и Скалу я с небольшим сарказмом написал? Или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 18:07 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K mayton пропущено... Ты не в теме. Ленивые вычисления идут не от фана а от работ математика Хаскелла Карри. Ленивость в ФП - это не просто фича а это база для построения других структур наподобие бесконечных "рекурсивных" списков которые без ленивости просто невозможно реализовать. Огонь! З.Ы. Но ведь понятно, что про фан и Скалу я с небольшим сарказмом написал? Или нет? Вообще ни разу непонятно. Но ты не обижайся. Многие синьоры-помидоры от мира Java очень плавают в настоящем ФП. Поэтому ты - не один. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 18:15 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, на AspectJ как-то так: Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68.
Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 18:17 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Андрей Панфилов, Спасибо, познавательно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 18:23 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
Vladmir K, помотри еще на Kotlin. Может там есть волшебная таблетка которая сделает тебя счастливым. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 18:25 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
mayton Вообще ни разу непонятно. Но ты не обижайся. Многие синьоры-помидоры от мира Java очень плавают в настоящем ФП. Поэтому ты - не один. Да я вообще не обижаюсь :) Ибо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 18:25 |
|
Ленивая инициализация при валидном значении NULL
|
|||
---|---|---|---|
#18+
mayton Vladmir K, помотри еще на Kotlin. Может там есть волшебная таблетка которая сделает тебя счастливым. Обязательно, на досуге. Спасибо за наводки и объяснения. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 18:26 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2120897]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
31ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 178ms |
0 / 0 |