如何使用静态工厂方法为不可变实体建模
How to model immutable entities with static factory method
你好,我有一个关于不可变实体建模的正确方法的问题:
考虑这个实体(根据 Jens Schauder 的建议编辑):
@Getter
@RequiredArgsConstructor(staticName = "of", access = AccessLevel.PACKAGE)
public final class Student {
private final @Id @Wither
long studentId;
@NotNull
@Size(min = 4, max = 20)
private final String userId;
@NotNull
@Min(0)
private final int matriculationNumber;
@NotNull
@Email
private final String eMail;
}
所以这个实体应该是不可变的,并提供静态 of
创建方法。 RequiredArgsConstructor
还构建了一个 私有构造函数 尽管它应该为每个定义的所有 final/non 空字段创建一个可见的包。简而言之,我做了一个 AllArgsConstructor
可以这么说。
这里的文档 https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#mapping.fundamentals 详细介绍了关于 "Object creation internals" 的部分,其中陈述了改进处理的 4 个方面 - "the constructor to be used by Spring Data must not be private" 在我看来已实现的其他方面。
所以我的问题是:
这张照片中的实体在不变性和 spring 数据 jdbc 内部优化映射方面是否正确?
编辑:
intellij 中的 lombok 插件似乎存在错误,阻碍了 access = AccessLevel.PACKAGE
做正确的事情。看这里:
https://github.com/mplushnikov/lombok-intellij-plugin/issues/584
虽然问题已经关闭,但新版本的插件不可用...
这取决于你对"optimum mapping"的定义。
它应该可以工作,所以这已经很重要了。
但是无法应用文档中描述的优化,因为您的构造函数是私有的。
因此,您失去了它可能无法实现的 10% 的性能提升 "optimal"。
但是 10% 的提升是关于对象实例化的。
这与涉及数据库的往返无关:
- 从您的实体中提取数据
- SQL 的构造(或查找)以供使用
- 将两者都发送到数据库
- 在数据库中执行查询
- 返回结果
这使得该优化的收益很可能远低于 10%,并且在大多数情况下无需担心。
当然,除非您使用真实数据制定自己的基准,否则您永远不会真正知道。
为此,您需要创建一个至少具有包范围的全参数构造函数。
你好,我有一个关于不可变实体建模的正确方法的问题:
考虑这个实体(根据 Jens Schauder 的建议编辑):
@Getter
@RequiredArgsConstructor(staticName = "of", access = AccessLevel.PACKAGE)
public final class Student {
private final @Id @Wither
long studentId;
@NotNull
@Size(min = 4, max = 20)
private final String userId;
@NotNull
@Min(0)
private final int matriculationNumber;
@NotNull
@Email
private final String eMail;
}
所以这个实体应该是不可变的,并提供静态 of
创建方法。 RequiredArgsConstructor
还构建了一个 私有构造函数 尽管它应该为每个定义的所有 final/non 空字段创建一个可见的包。简而言之,我做了一个 AllArgsConstructor
可以这么说。
这里的文档 https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#mapping.fundamentals 详细介绍了关于 "Object creation internals" 的部分,其中陈述了改进处理的 4 个方面 - "the constructor to be used by Spring Data must not be private" 在我看来已实现的其他方面。
所以我的问题是: 这张照片中的实体在不变性和 spring 数据 jdbc 内部优化映射方面是否正确?
编辑:
intellij 中的 lombok 插件似乎存在错误,阻碍了 access = AccessLevel.PACKAGE
做正确的事情。看这里:
https://github.com/mplushnikov/lombok-intellij-plugin/issues/584
虽然问题已经关闭,但新版本的插件不可用...
这取决于你对"optimum mapping"的定义。
它应该可以工作,所以这已经很重要了。
但是无法应用文档中描述的优化,因为您的构造函数是私有的。 因此,您失去了它可能无法实现的 10% 的性能提升 "optimal"。
但是 10% 的提升是关于对象实例化的。 这与涉及数据库的往返无关:
- 从您的实体中提取数据
- SQL 的构造(或查找)以供使用
- 将两者都发送到数据库
- 在数据库中执行查询
- 返回结果
这使得该优化的收益很可能远低于 10%,并且在大多数情况下无需担心。
当然,除非您使用真实数据制定自己的基准,否则您永远不会真正知道。 为此,您需要创建一个至少具有包范围的全参数构造函数。