最近发现effective java这本书真的好到不行,于是决定边看边写读书笔记。里面主要是编程的思维技巧,或者说是些好习惯
由于人比较懒,所以内容就不介绍太详细了,我只是站在我的角度来写对这些技巧的理解和现在不懂的地方。这里介绍的是为了让读者比较方便快速的看到知识点。不喜欢原文照搬,而且想想应该也不会78个技巧就写78个帖子,所以大家觉得有兴趣的话建议还是去弄本书看看,下个pdf也行,这里送个链接:《effective java-中文版CSDN资源》 上传者是我本人,我设置的是需要0积分,大家多多支持哈
一、使用静态工厂方法代替构造器。
——–优点:
1.有自己的名称
这个很好理解,就是别人都是一大堆的构造方法A() ,A(String s),A(String s,int i)………看的头晕眼花
而你就可以getAByString(String s). 这样客户端代码敲起来会轻松点。
2.避免每次都创建新对象
关键是使得类可控,比如你要使用单例模式或者不可实例化类,又或者是不可变类。这些情况你就非常需要静态工厂方法,而不是开放一个甚至一堆public的构造器在那里。举个例子,就说单例模式singleton,你需要做到的是这个类的实例由始至终都只有一个实例,那么你肯定不能开放public的构造器,只能通过写个静态工程方法(例如getInstance)来帮你控制。
3.可以返回任何原类型子类
书中的例子是interface-based-framework和java collection framework。典型的代表就是像他们这样不可实例化的类。
里面有一句很能帮助理解的话:静态工厂方法返回对象所属的类,在编写包含该工厂方法时可以不必存在。也就是说他可以是一个入口,他不返回自己的实例,返回的都是一些子类实例。比如说有个抽象类People,他的getInstance(Boolean sex),会根据参数不同返回他的子类Man和Woman,而不会返回不可实例化的自己。
4.实例化时使代码更加简洁
例如HashMap实例化时感觉语句比较长,如果有静态工厂方法就可以是:HashMap.newInstance()
——缺点:
1.如果没有public或者protected的构造器,就不能被子类化
这个是显然的,但是书中也有提到,使用静态工厂方法的思维本来就是不提倡过多继承,而是提倡复合。
2.与其他静态方法没有本质区别
所以主要是API文档中不显眼,读者依然会一眼看到构造器而不是看到他。
总结:
个人认为使用静态工厂方法来代替构造器是个比较不错的思路,在对类的控制上他十分的优秀,在使用到特别的设计模式或是有特别需求的时候,效果是非常明显的。静态工厂方法适用场合比较宽,通过他可以更加可靠的为程序获取一个实例。而公共构造器当然也有自己适用的场合,毕竟他是继承机制最重要的一环。这一个给我们的启发主要是不要永远先想到公共构造器。
最后,试一下内嵌电子书
后记补充:今天上来看了看自己帖子,发现引用的CSDN内嵌swf貌似是flexpaper做的,我被这死东西折磨了三天,现在刚刚好搞定………要的效果就是和现在上面一样,真巧啊= =迟点写篇java在线文档阅读的帖子,再友情链接下我.net的在线文章阅读帖子好了= =真是巧啊………为啥我老是跟在线文档纠缠不清呢…
It’s perfect time to make some plans for the future and it’s time to
be happy. I’ve read this post and if I could I want to suggest you few interesting things or advice.
Perhaps you can write next articles referring to this article.
I desire to read even more things about it!