如何使用静态工厂方法为不可变实体建模

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%,并且在大多数情况下无需担心。

当然,除非您使用真实数据制定自己的基准,否则您永远不会真正知道。 为此,您需要创建一个至少具有包范围的全参数构造函数。