用静态工厂方法替代构造器(各有用处)
构造器方法
package codeTemplate.effectiveJava.bean;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Fruit {
private String color;
private String shape;
private int price;
public Fruit(String color, String shape, int price) {
this.color = color;
this.shape = shape;
this.price = price;
}
public Fruit() {
}
}
静态工厂方法(可以起不同的函数名表示要创建怎样的对象)
package codeTemplate.effectiveJava.bean;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Fruit {
private String color;
private String shape;
private int price;
private Fruit() {
}
public Fruit newInstance(String color, String shape, int price) {
Fruit fruit = new Fruit();
fruit.setColor(color);
fruit.setShape(shape);
fruit.setPrice(price);
return fruit;
}
public Fruit newFruitWithShape(String color, String shape, int price) {
Fruit fruit = new Fruit();
fruit.setShape(shape);
return fruit;
}
}
遇到多个构造器参数时考虑使用构造器
package codeTemplate.effectiveJava.bean;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Fruit {
private String color;
private String shape;
private int price;
public Fruit(Builder builder) {
this.color = builder.color;
this.shape = builder.shape;
this.price = builder.price;
}
public static class Builder {
private String color;
private String shape;
private int price;
public Builder() {
}
public Builder setShape(String shape) {
this.shape = shape;
return this;
}
public Builder setColor(String color) {
this.color = color;
return this;
}
public Builder setPrice(int price) {
this.price = price;
return this;
}
public Fruit build() {
return new Fruit(this);
}
}
}
用私有构造器或者枚举类强化Singleton属性
枚举类的单例模式
package codeTemplate.effectiveJava.bean;
public class Singleton {
private Singleton(){
}
public enum SingletonEnum {
SINGLETON;
private Singleton instance;
private SingletonEnum(){
instance = new Singleton();
}
public Singleton getInstance(){
return instance;
}
}
}
使用
public class EffectiveJavaDemo {
public static void main(String[] args) {
Singleton s1 = Singleton.SingletonEnum.SINGLETON.getInstance();
Singleton s2 = Singleton.SingletonEnum.SINGLETON.getInstance();
System.out.println(s1==s2);
}
优先考虑依赖注入来引用资源(构造器的输入参数)
package codeTemplate.effectiveJava.tool;
public class SpellChecker {
private final DictionaryOfI18 dictionary;
//dictionary为外部的资源(如字典.txt)
public SpellChecker(DictionaryOfI18 dictionary) {
this.dictionary = dictionary;
}
}