gpt4 book ai didi

java - 支持最终字段的 Java 持久性提供程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:11 25 4
gpt4 key购买 nike

我是 Java 的新手,但我一直在养成一种习惯,即尽可能使用 final 来声明不变性,我认为这是一件好事。 (考虑 f#)

我了解到 JPA 不支持 final 字段。 hibernate ,TopLink?我不确定这些,但我现在更喜欢 JPA。

这在理论上是否有可能 - 让我们通过反射(reflection)来说 - 在创建后修改 final 字段?我的猜测是……不 :)

对于持久性解决方案来说,当然可能的是支持带参数的构造函数。至少我认为没有理由使这成为不可能。我猜映射会有点棘手。这是一个替代解决方案。

建议?

编辑: 我不熟悉不可变的确切定义,所以我凭直觉在这篇文章中使用了它。在这里声明 Immutability 意味着声明一个字段不能被改变。抱歉造成误会。

最佳答案

对象不可变性(注意不可变对象(immutable对象)与声明字段 final 之间的区别 - 只有所有字段都是 final 时对象才是不可变的,因此对象的状态在创建后不能更改)是一个非常敏感的话题。我自己喜欢它们,hibernate 通过@Immutable 支持它们。

不知道它在 JPA 2 中的状态,但要回答有关 final 字段的问题:您可以使用反射更改它们的值 - 但反射在 Java EE 环境中受到严重限制。

启发主要问题:如果您的 POJO 是不可变的,那么持久性解决方案将如何重新创建对象?假设您有两个 final int 字段和一个初始化它们的构造函数。持久层不能有任何关于它们的顺序或名称的信息(因为字段和参数名称在编译期间被删除)。

Koshuke 发布了一篇关于此的博客(与支持不可变 bean 的 JAXB 相关),但现在找不到。

关于java - 支持最终字段的 Java 持久性提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2455906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com