在 Effective Java 中提到“与构造函数不同,静态工厂方法不需要在每次调用时都创建一个新对象”。
class Car{
String color;
Boolean spoiler;
public Car(String s){
color=s;
spoiler = false;
}
public static Car redCar(){
return new Car("red");
}
}
在主类中:
Car c2 = Car.redCar();
Car c3 = Car.redCar();
c2 和c3 是不同的对象。我没有得到“不需要每次调用都创建一个新对象”的上下文。
最佳答案
因为那是你所做的:
public static Car redCar(){
return new Car("red");
}
// ^ here
如果你想返回相同的值,你可以这样做:
private static final Car RED_CAR = new Car("red");
public static Car redCar(){
return RED_CAR;
}
重点是调用 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);
}
这使用 Car
构造函数作为 method reference到新Map.computeIfAbsent
方法,如果该颜色的 Car
尚未出现在 Map
中,则调用它。这是一个简单的(非线程安全的)缓存实现。
所以:
final Car one = Car.newInstance("red");
final Car two = Car.newInstance("red");
System.out.println(one == two) // true
关于java - 静态工厂方法每次调用时都会创建一个新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29796947/