From e8326a67112719caca26bb6c5046a99217937ffc Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Wed, 2 Oct 2024 22:03:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B5=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D1=83=D0=B9=D1=82=D0=B5=20Data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/java/Не используйте @Data.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/dev/java/Не используйте @Data.md b/dev/java/Не используйте @Data.md index 592b85eb..8bcdc72a 100644 --- a/dev/java/Не используйте @Data.md +++ b/dev/java/Не используйте @Data.md @@ -9,20 +9,19 @@ zero-link: parents: linked: --- -Многие разработчики в принципе против использования Lombok. В общем, это холиварная тема. Но вы используете Lombok в проекте, то не используйте хотя бы спорные и откровенно вредные аннотации. +Многие разработчики в целом против использования Lombok. Это действительно холиварная тема. Но если вы всё-таки используете Lombok в проекте, постарайтесь избегать спорных и потенциально вредных аннотаций. -Одна из таких – это `@Data`. Во-первых, [мало кто помнит, что она под собой скрывает](https://projectlombok.org/features/Data). +Одна из таких — это `@Data`. Во-первых, мало кто помнит, [какие методы она генерирует](https://projectlombok.org/features/Data). +- `@EqualsAndHashCode`. Это наиболее проблемная аннотация в составе `@Data`. Она генерирует методы `equals()` и `hashCode()` для всех полей класса, но зачастую этого не требуется. Например, для сущностей достаточно сравнивать только по идентификатору. +- `@ToString`. Если объект содержит чувствительную информацию, этот метод может вывести её в лог, что небезопасно. +- `@Getter` / `@Setter`. Здесь проблем нет. +- `@RequiredArgsConstructor`. Тоже допустимо. -- `@ToString`. Не помню, когда последний раз переопределял `toString()`. А если объект содержит чувствительную информацию? -- `@EqualsAndHashCode`. Это самая вредная аннотация в @Data. ==Потому что она генерирует `equals()` и `hashCode()` по всем полям.== Обычно вы не хотите, чтобы генерация осуществлялась по всем полям. Например, для сущности достаточно идентификатора. -- `@Getter` / `@Setter`. Здесь ничего плохого. -- `@RequiredArgsConstructor`. Тоже окей. +Основная проблема кроется в аннотации `@EqualsAndHashCode`. Конечно, можно использовать `@EqualsAndHashCode.Exclude`, чтобы исключить отдельные поля из генерации, но вам придётся добавлять это почти ко всем полям. Использовать `@EqualsAndHashCode.Include` не получится — вы не можете включить только необходимые поля, придётся исключать все лишние. -Основная проблема в `@EqualsAndHashCode`. Можно, конечно, использовать `@EqualsAndHashCode.Exclude`. Эта аннотация запрещает использовать поле при генерации, но вы хотите расставлять это над почти всеми полями в сущности? Потому что `@EqualsAndHashCode.Include` просто не сработает, нельзя объявить только нужные поля, нужно будет именно исключать все ненужные. +Кроме того, избегайте аннотаций из пакета `experimental`. Эти аннотации нестабильны и могут быть удалены в следующих версиях Lombok. Единственным исключением является [@FieldNameConstants](https://projectlombok.org/features/experimental/FieldNameConstants). За несколько лет с ней не возникало проблем, а существующие альтернативы оставляют желать лучшего. -Также избегайте всех аннотаций из пакета `experemental`. Все аннотации из этого пакета могут работать не стабильно, и при этом могут быть удалены из следующих версий. Исключением из этого пакета является [@FieldNameConstants](https://projectlombok.org/features/experimental/FieldNameConstants), за пару лет с ней не было никаких проблем, а все имеющиеся альтернативы не очень. - -С Lombok код выглядит чище, но, как и в случае с любым другим магическим инструментом, важно понимать, как именно он работает и когда его использовать. В противном случае производительность приложения может снизиться, либо оно вовсе может перестать работать корректно. +В целом, Lombok делает код чище, но, как и с любым “магическим” инструментом, важно понимать, как он работает и в каких случаях его применение уместно. В противном случае это может привести к снижению производительности или даже некорректной работе приложения. *** ## Мета информация **Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]