有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java静态工厂方法不起作用

开始阅读“高效java”,但当我尝试编写一个示例时,我不明白为什么它对我不起作用

编译错误:

Error:(12, 16) java: constructor Car in class Car cannot be applied to given types;


public class Car {

    String model;

    //no private constructor

    public static Car fromModel(String model) {
        return new Car(model);
    }

}

这里一切正常:

public class Car {

    String model;

    //no private constructor

    public static Car fromModel(String model) {
        return new Car(model);
    }
}

//Here everything is OK:

public class Car {

    String model;

    private Car(String model) {
        this.model = model;
    }

    public static Car fromModel(String model) {
        return new Car(model);
    }

}

如果“考虑静态工厂方法而不是构造函数”,为什么要生成构造函数


共 (3) 个答案

  1. # 1 楼答案

    “考虑静态工厂方法而不是构造函数”指的是向类外部的库用户提供对对象实例化的访问

    工厂方法使用的构造函数是工厂方法的一个实现细节,其方式与static public方法相同-对于类库的外部用户,该方法和私有构造函数共同构成一个工厂方法

  2. # 2 楼答案

    对我来说,答案是我需要至少一个私有构造函数来创建几个静态方法

    无编译错误:

    public class Car {
    
    String model;
    String color;
    String modelYear;
    
    private Car(String model, String color, String modelYear) {
        this.model = model;
        this.color = color;
        this.modelYear = modelYear;
    }
    
    public static Car fromModelAndColor(String model, String color){
        return new Car(model, color, null);
    }
    
    public static Car fromModelAndYear(String model, String modelYear){
        return new Car(model, null, modelYear);
    }
    
    public static Car fromModelAndColorAndYear(String model, String color, String modelYear){
        return new Car(model, color, modelYear);
    }
    

    }

  3. # 3 楼答案

    你的例子可能很简单。普通构造函数可以有大量参数。在这种情况下,您可以通过创建静态构造函数方法来“命名”每个构造函数。其次,使用此模式可以隐藏部分构造函数参数

    例如:

    class FinishEvent {
       privare Car response;
       private boolean success;
       private String errorMessage;
    
      //private constructor, we delegate creating to named methods
       private FinishEvent(Car response, boolean success, String errorMessage) {... } 
    
    }
    

    正如你们在这里看到的,Car是一个响应,但当活动成功时,我们不需要填写错误消息。另一方面,如果这个过程失败了,我们就没有响应来填写

    静态构造函数方法在这里派上了用场:

    public static FinishEvent success(Car response){
      return new Car(response, true, null);
    }
    public static FinishEvent failed(String errorMessage){
      return new Car(null, false, errorMessage);
    }
    

    有了这个API,你的类的其他用户就知道如何使用它了

    如果您的Car是一个抽象方法,那么您的工厂方法可以提供实现。这样,您可以对用户隐藏所有实现,但提供一种创建它们的方法