欢迎使用6miu-markdown编辑器

xiaoxiao2021-02-28  114

Effective Java(2)-创建和销毁对象(上)

这一章的内容主要涉及7个条目

内容大纲

先上一个思维导图^_^,顺便推荐一个在线画图的好工具(Process On),有兴趣的可以试下,非常好用,强烈推荐! 下面让我们细细研究各个条目的内涵。

第1条:考虑用静态工厂方法代替构造器

优势1:静态工厂方法有名称,而构造器没有

什么意思呢? 例子:我们这儿有一个需求,创建一个记录熊的类,熊有狗熊、北极熊、熊猫。 1)我们使用构造器Beer(address, color)创建:

狗 熊 = new Beer(丛林,黑色); 北极熊 = new Beer(北极,白色); 熊 猫 = new Beer(中国, 黑白);

2)我们使用静态工厂方法创建:

狗 熊 = Beer.GouXiong(); 北极熊 = Beer.BeiJiXiong(); 熊 猫 = Beer.XiongMao();

看到了吧,静态工厂方法有(GouXiong、BeiJiXiong、XiongMao)等名称,我们创建的时候,可以很容易的知道创建的熊的种类。与之相反的是构造器,构造器是没有名称的。

优势2:不必每次调用的时候都创建一个新对象

我们以Boolean.valueOf()为例:

Boolean A = Boolean.valueOf(true); Boolean B = Boolean.valueOf(true); 我们从Boolean.valueOf()的源码可以看到,每次调用valueOf()时,其实返回的都是TRUE 或者 FALSE实例, 没有创建新的实例,是不是很炫^_^。

优势3:可以返回原返回类型的任何子类型

优势4:创建参数化类型实例的时候,使代码更简洁

对比下面的构造器和静态工厂方法,是不是发现,使用静态工厂方法的更简洁^_^

第2条:遇到多个构造器参数时要考虑用构建器

需求:构造器有多个参数,前两个参数必选,后面的可选

方法1:重叠构造器

如果我只想设置第1、2、6参数的值,那我只能这样调用构造器了: NutritionFacts cocaCola = new NutritionFacts(240, 8, 0, 0, 0, 27); 我们需要设置所有的参数,但实际上,我们只想设置3个参数而已。

方法2:Java Bean方式

这种方法也比较繁琐,最主要的是多线程并发访问的时候,由于初始化包含多条语句,很容易导致数据不一致。当然,我们可以通过额外的方法保证其线程安全,但这样也带来了额外的开销。

方法3:Builder模式

发现Builder模式的灵活性了吧,我们可以任意增加我们想设置的参数。

这周我们现讲到这儿,下周我们继续讲剩下的5条。。。

第3条:用私有构造器或者枚举类型强化Singleton属性

第4条:通过私有构造器强化不可实例化的能力

第5条:避免创建不必要的对象

第6条:消除过期的对象引用

第7条:避免使用终结方法

扫码关注订阅号“Java技术博文”,更多内容,等你来瞧!

转载请注明原文地址: https://www.6miu.com/read-61725.html

最新回复(0)