第1条:考虑用静态方法而不是构造器

一个客户端若想获得某个类的一个实例,一种传统的方式就是让该类提供一个公有的构造器。但是,每个程序员的工具箱里头也应当还有另一种技术:该类也可以提供一个公有的静态工厂方法,然后通过这个静态方法来返回该类的一个实例。这里举一个Boolean类(基本类型boolean的封装类)的例子。这个方法将一个boolean基本类型值转换成一个Boolean对象引用:

1
2
3
public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

要注意的是,静态工厂方法不同于设计模式[工厂方法模式

静态工厂方法的优势是:

它们有名字,

静态工厂方法不必在每次被调用时都产生一个新的对象,

静态工厂方法能返回原返回类型的任意子类型的对象,

可以根据调用时传入的不同参数而返回不同类的对象,

在编写包含该方法的类时,返回对象的类不需要存在

 

只提供静态工厂方法的主要限制在于,没有公有或者保护构造方法的类不能子类化。例如,Java的集合框架里面的任一便利实现都无法被子类化。但另一方面,这也鼓励了程序员使用组合而不是继承,而且这也是不可变类型所需要的。从这两个角度看,也算是因祸得福了。

静态工厂方法的第二个不足之处是程序员难以找到他们。它们并不像构造器那样能在API文档中明显标示出来,因而会有点难以知道如何初始化一个只提供静态工厂方法而不是构造器的类。也许Javadoc文档工具在未来某一天会注意到这个问题。为了减少这个问题的出现,我们可以多关注类文档或接口文档里的静态工厂,同时遵守通用的命名规则。 

posted @   webzom  阅读(209)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示