1

在 API 设计中,做这样的事情是否常见:

public ReadOnlyCollection GetCollection
{
get { // Get's read only collection here... 
}
}

在 get 的主体中,这会调用填充集合的私有方法。所以我只向客户公开一个一致的对象。让我感到困惑的是,让类及其成员静态化是否正确?毕竟,我们正在返回一个对象,因此该类也是不可变的(我一直认为不可变的类应该是静态的?)。我知道静态并不暗示无国籍。我认为静态是否适合作为一个实体集中的任何事物(例如公司详细信息)?

谢谢

4

3 回答 3

1

避免static- 这是过程编程的一个特点。仅将其用于实用方法和可广泛访问的常量。

并且没有 - 静态!= 不可变,它们没有任何共同点。静态是一种全局状态,它不是线程安全的,您的应用程序中的静态数据不能出现多次。

不可变意味着对象实例不能改变其内部状态。例如——一旦你String构建它,你就不能改变它。不过,它与静态无关。

至于第一个问题 - getter 公开内部集合是完全可以的,尤其是它的只读副本。

于 2010-09-29T18:39:44.687 回答
0

getter 方法的目的只是返回一个值,以完全黑盒的方式返回值的来源。在 getter 方法中添加附加代码是很常见的,您正在谈论的具体示例听起来像是一种称为“延迟初始化”的技术。这一点也不违反任何 OO 原则。

选择静态或非静态与状态或可变性无关。如果有的话,你想问一下这个类是否应该代表一个 Singleton。如果它将“公司详细信息”作为一组常量保存,那么静态将是合适的。如果该类基本上是一个 DAO,并且在每个请求上重新获取公司详细信息的最新更改,那么您可能需要一个非静态类。听起来您的示例更倾向于前者。

于 2010-09-29T19:05:19.953 回答
0

根据模型要求,拥有“智能”设置器和吸气器是可以的。我不认为您描述的“静态类”使用在这里是正确的。如果要返回计算列表,则可能希望将其设为不可修改的集合。这有助于(但不是您要做的全部),因此更改域对象的唯一方法是通过设置器。

于 2010-09-29T18:41:37.790 回答