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

标签 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");
    }
  }

在主类中:

    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/

相关文章:

Java 同步静态方法 : lock on object or class

java - 为什么两个程序有前向引用错误而第三个没有?

c++ - 工厂模式在编译时分配内存,以及如何打印编译时信息

java - 查询HashMap内部实现

java - Java 中的集中式数据库连接管理

具有自定义初始化的 C++ 静态分派(dispatch)

java - Factory设计的实现,在Spring Boot中遇到这个错误

java - 无法从其他电脑的 phpmyadmin(wamp) 的 mysql 数据库中检索条目

java - log4j 相对文件路径

hibernate - 多模块项目 spring 3.0 AnnotationSessionFactoryBean packagesToScan 属性值按模块设置