虽然工作了两年仍然是个彩笔,就从effective java这本书开始学吧!
静态工厂方法
优点:有名称,不必每次调用创建新对象,可返回原返回类型的任何子类型对象,参数实例化更简洁。
缺点:如果不含共有的或受保护的构造器 就不能被实例化(目前不理解)
不必每次创建新对象:感觉针对的是不可变类
参数实例化更简介:类型推导(在JAVA7之后版本中有丰富了很多类型推导概念)
//较为繁琐的写法
Map<String, List<String>> map = new HashMap<String, List<String>>();
//若HashMap提供该静态工厂方法
public static <K, V> HashMap<K, V> newInstance(){
return new HashMap<K, V>();
}
//通过静态工厂提供的简洁写法
Map<String, List<String>> map = HashMap.newInstance();
builder模式
核心在于创建对象时 “方便设置参数” 和 “和线程安全”。
1. 构造
eg: new People(name,gender,age,address等); 设置参数却没有正好只有臃肿参数的构造时,无法挑选最恰当的构造
2. getter() setter()
开放getter()和settting()方法,阻止了改类做成不可变的可能,这就需要保证线程安全(!?)
3. builer模式
Builder是该类的静态成员类。如果类的参数或者静态工厂中具有多个参数,设计类时Builder模式是个不错的选择。
public class Person {
private String Id;
private String name;
private String address;
public static class Builder{
//所必须的参数
private final String Id;
//可选的参数
private String name = "";
private String address = "" ;
public Builder(String id){
this.Id = id;
}
public Builder name(String name){
this.name = name;
return this;
}
public Builder address(String address){
this.address = address;
return this;
}
public Person build(){
return new Person(this);
}
}
private Person (Builder builder){
this.Id = builder.Id;
this.name = builder.name;
this.address = builder.address;
}
}
singleton(单例)
实现方法
- 声明类变量,创建时判断是否为null
- 声明静态类变量,构造私有化 (以上两种方法需要注意1.序列化,2.瞬时的实例域,3.防止反射调用私有构造器)
- enum枚举类: enum继承Enum,final无法继承,具有私有构造,java规定无法序列化反序列化enum(安全)
私有构造
无法被子类化,子类无法调用超类的构造。