Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate设置的字段可以是最终字段吗?_Java_Eclipse_Hibernate_Reflection_Final - Fatal编程技术网

Java Hibernate设置的字段可以是最终字段吗?

Java Hibernate设置的字段可以是最终字段吗?,java,eclipse,hibernate,reflection,final,Java,Eclipse,Hibernate,Reflection,Final,我的Eclipse在保存Java文件时会自动执行许多代码清理操作,其中包括在可能的情况下将final添加到private字段 这会与Hibernate将实体属性注入私有字段的能力相冲突吗 @Id private final Long id = null; // Eclipse made this "final" // but Hibernate needs to set the id 我应该关闭此保存操作吗 更新:我已经测试了

我的Eclipse在保存Java文件时会自动执行许多代码清理操作,其中包括在可能的情况下将
final
添加到
private
字段

这会与Hibernate将实体属性注入私有字段的能力相冲突吗

@Id
private final Long id = null;   // Eclipse made this "final"
                                // but Hibernate needs to set the id
我应该关闭此保存操作吗


更新:我已经测试了该应用程序,还使用调试器查看了它,Hibernate确实重置了“final”字段,所以一切正常。但这能保证有效吗?例如,没有任何VM或编译器优化依赖于真正是最终的字段。这些可能会破裂。另一方面,能够通过反射设置
私有
字段似乎是一个受支持的场景,因此同样的想法可能也适用于
最终

有趣的问题。我认为对于持久化对象,您可能不想自动设置final,原因正是您提到的

如果您的类具有某种功能,您可以执行以下操作,那么这肯定是一个问题

setProperty(int prop) {
    this.prop = prop;
    fireChanged(); // updates other fields that depend on this one
}

这是我在专业背景下看到的。虽然这里的插件可能足够聪明,不会让它成为最终版本

如果你想让你的对象不可变,你可以让你的持久类返回一个自身的不可变子类,其中的字段是私有的


所以这个插件有优点也有缺点。我想你可以用任何一种方法,只要你有测试来验证自动生成的期末考试不会妨碍你。但就我个人而言,我不会使用该插件——我会查看IDE警告并选择我的期末考试…

即使它有效,也不要这样做

最后一个字段可以只写一次,java内存模型的一部分基于这一事实

我发现了这个博客,它显示了用一个真正的黑客通过反射设置最终版本是可能的。(但请不要在任何实际应用中这样做。)

这是对一个相关问题的回答:


在您的情况下,最简单的解决方法是:使字段可变,并且只提供一个getter而不是setter。

Hibernate似乎不再关心final,而只关心private…”“也许这里的插件足够聪明,不会将其设为final”。它足够聪明。它与Eclipse一起提供,并且在推荐的代码清理列表中。所以我真的很想让它保持启用状态。@thilo——hibernate中的字段级访问使用反射,所以它可能可以绕过最后一个。我敢打赌这就是为什么它有效…我只是想知道它是否真的有效。例如,内存模型对final字段的处理方式似乎有所不同,这可能取决于它们是否是final。因此,我想我真正的问题是“如果我为私有final字段分配新的值,这完全可以使用反射,我是否有可能破坏某些内容?”我的Eclipse不应该这样做。您可以配置Eclipse清理来执行此操作或不执行此操作:preferences\java\code style\cleanup-edit-tab“Variable declarations”中的“code style”选项。。。