在域模型中定义LinkedHashSet的最佳方法

时间:2014-11-11 09:24:57

标签: java

这将是从以下两个选项

中定义Java域模型中的LinkedHashSet的最佳方法

选项1

private Set<String> myCollection;

public Set<String> getMyCollection() {
    if (myCollection == null) {
        return new LinkedHashSet<String>();
    } else {
        return myCollection;
    }

}

public void setMyCollection(Set<String> myCollection) {
    this.myCollection = myCollection;
}

选项2

private LinkedHashSet<String> myCollection;

public LinkedHashSet<String> getMyCollection() {
    return myCollection;
}

public void setMyCollection(LinkedHashSet<String> myCollection) {
    this.myCollection = myCollection;
}

1 个答案:

答案 0 :(得分:1)

作为一种好的做法,即使它们不包含任何元素,也应返回空集合,而不是空值。安全的一个好方法是在声明时实例化它们 其次,你应该尽可能编程到接口而不是实现。除非您的客户端代码使用实现类的某些特殊功能,否则您应该声明并返回接口类型。这使得以后可以在不破坏客户端代码的情况下更改实现。

所以你的声明可以写成:

private Set<String> mySet = new LinkedHashSet<String>();

考虑延迟初始化(在getter中)的唯一原因是优化。例如,您可能预期会有大量实例,而其中很少可能需要访问它们。否则,稳健性与性能因素不会得到回报。

正如Seelenvirtuose所评论的那样,您也可以选择提供一些集合构建器代码,而不是使用getter公开集合本身。这主要是双向关联的情况(当集合元素对象在托管集合的对象中保留引用时)。但即使这样,客户端代码也可能需要访问该集合。使用 java.util.Collections.unmodifiableSet()方法公开集合的未修改视图。 (当然在这种情况下你也应该删除集合设置器。)

同样正如JB Nizet所说,你应该非常小心。如果您决定添加它们,则必须注意不要引入副作用。如果传递的集合也被其他对象引用,那么您的类可能会无意中修改这些对象的状态,这会导致令人讨厌的错误,有时很难被发现。
如您所知,您的方法取决于您对客户端代码的控制程度以及您的类所服务的用例。在许多情况下,对简单性的权衡是常见的。