您将如何声明OneToMany成员变量

时间:2010-09-01 05:10:32

标签: java hibernate orm jpa

以下哪一项声明是选择分配适量内存的正确选择。选项1的初始收集容量为0,选项2的初始容量为10,选项3的初始容量为10。

如果底层ORM提供程序最终加载这些对象,则不会使用setEmails(..)方法来设置Collection的值。如果是这样,那么在选项3中声明它是否有意义,这样我就可以避免不必要的内存分配。

Option 1
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Email> emails = new HashSet<Email>(0);

Option 2
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Email> emails = new HashSet<Email>();

Option 3
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Email> emails;

2 个答案:

答案 0 :(得分:1)

这是微观优化。

从技术上讲,就内存分配而言,它们是有序的:

Option 3优于Option 1略好于Option 2

但是,Option 2可能是您的最佳选择

  • 添加项目时无需展开Set
  • 您的代码将更容易处理,因为您不必检查null

答案 1 :(得分:0)

  

如果是这样,在选项3中声明这个是否有意义,这样我就可以避免不必要的内存分配。

嗯, 也会创建实体。因为我喜欢在处理双向关联时使用防御式编程方法,如下所示:

public void addToEmails(Email email) {
    emails.add(email);
    email.setUser(this);
}

我倾向于选择选项#2,因为我不需要进行空检查。

老实说,我甚至没有考虑实例化空集合的“成本”。这很可能不会破坏我的应用程序性能。

如果你的应用程序变慢了(你甚至知道它为什么?它真的是内存或GC问题吗?你诊断或测量的是什么?),我很确定有比这更重要的优化去做。实际上,我打赌我的衬衫。

不要忘记:

  

如果无法衡量,则无法改善。 - Lord Kelvin