博主双12入手了一本"Effective Java第二版",本系列文章将初步梳理书中内容,我也查了些资料,我会针对知识点做一点展开,方便以后复习回顾;
Item1.考虑用静态工厂代替构造器:
静态工厂的优势:
更易于阅读(有名称) |
可以做成单例(Singleton)的 |
可以实现多态(返回多个子类型的对象) |
在创建参数化类型的实例时,他们使代码变得更加简洁 |
静态工厂存在的不足:
1.类如果不含共有的或者受保护的构造器,就不能被子类化;
2.他们与其它的静态方法其实没区别,因此对于客户来说如何使用变成了难题.
Item2:对于多个构造器参数时,利用构建器(Builder Mode):
利用构造器重载确实可以解决少量构造器参数对象的初始化,但大量比如十几个甚至几十个的时候,客户端的代码很难编写,更别说阅读了,建议用建造者模式来解决;
建造者模式的核心就是:将需要的域(包括必须的参数和不必须的参数)放在一个Builder类中,必须的参数放在Builder的构造器中初始化(只要用到Builder对象就会调用其构造器),可选参数利用对应的set方法供客户端调用实现初始化:
//Builder Parttern public class User { private final String userName; private final String pwd; private final String mobile; private final String e_mail; public static class Builder { //Required parameters private final String userName; private final String pwd; //Optional parameters - initialized to default values private final String mobile = "13900000000"; private final String e_mail = "[email protected]"; public Builder(String userName, String pwd){ this.userName = userName; this.pwd = pwd; } public Builder mobile(String mobile){ this.mobile = mobile; return this; } public Builder e_mail(String e_mail){ this.e_mail = e_mail; return this; } public User build(){ return new User(this); } } private User(Builder builder){ userName = builder.userName; pwd = builder.pwd; mobile = builder.mobile; e_mail = builder.e_mail; } } //Client Code User user = new User.Builder("Joey","123").mobile("13512511111"). e_mail("[email protected]");
但建造者模式实现也不是完美的,为了创建对象,必须先创建其构建器,在十分注重性能的场景下,它有可能比重载构造器更加冗长,如果要用建造者模式,最好一开始就用.