静态工厂方法每次调用时都会创建一个新对象

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是不同的对象.我没有得到"每次调用都不需要创建新对象"的上下文.

Bor*_*der 8

因为那就是你做的:

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)