Nit*_*hin 6 java static factory
在Effective Java中,它提到"与构造函数不同,静态工厂方法在每次调用时都不需要创建新对象".
class Car{
String color;
Boolean spoiler;
public Car(String s){
color=s;
spoiler = false;
}
public static Car redCar(){
return new Car("red");
}
}
Run Code Online (Sandbox Code Playgroud)
在主类:
Car c2 = Car.redCar();
Car c3 = Car.redCar();
Run Code Online (Sandbox Code Playgroud)
c2和c3是不同的对象.我没有得到"每次调用都不需要创建新对象"的上下文.
因为那就是你做的:
public static Car redCar(){
return new Car("red");
}
// ^ here
Run Code Online (Sandbox Code Playgroud)
如果要返回相同的值,可以执行以下操作:
private static final Car RED_CAR = new Car("red");
public static Car redCar(){
return RED_CAR;
}
Run Code Online (Sandbox Code Playgroud)
关键是调用new Car()将始终返回一个新实例.呼叫Car.newInstance()意味着Car班级可以决定做什么.
例如:
private static final Map<String, Car> CARS = new HashMap<>();
public static Car newInstance(final String colour){
return CARS.computeIfAbsent(colour, Car::new);
}
Run Code Online (Sandbox Code Playgroud)
这使用Car构造函数作为新方法的方法引用Map.computeIfAbsent,如果该Car方法中尚未存在该颜色,则调用它Map.这是一个天真(非线程安全)缓存实现.
所以:
final Car one = Car.newInstance("red");
final Car two = Car.newInstance("red");
System.out.println(one == two) // true
Run Code Online (Sandbox Code Playgroud)