簡體   English   中英

靜態工廠方法不起作用

[英]Static factory method does not work

開始閱讀“有效的Java”,當我嘗試編寫示例時,無法理解為什么它對我不起作用。

編譯錯誤:

錯誤:(12,16)java:類Car中的構造函數Car無法應用於給定類型;


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);
    }

}

如果“考慮靜態工廠方法而不是構造函數”,為什么還要生成構造函數?

“考慮靜態工廠方法而不是構造函數”是指為類之外的庫用戶提供對對象實例化的訪問。

工廠方法使用的構造函數是工廠方法的實現細節,其方式與static public方法相同-該方法和私有構造函數共同構成類庫外部用戶的一個工廠方法。

對我來說,答案是我至少需要一個私有構造函數來制作幾個靜態方法。

沒有編譯錯誤:

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);
}

}

您的示例可能非常簡單。 普通構造函數可能具有大量參數。 在這種情況下,您可以通過創建靜態構造函數方法來“命名”每個構造函數。 其次,使用此模式可以隱藏構造函數參數的一部分。

例:

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是這里的響應,但是當Event成功時,我們不需要填寫errorMessage。 另一方面,如果處理失敗,我們將沒有回應。

靜態構造函數方法派上用場了:

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是抽象方法,則工廠方法可以提供實現。 這樣,您可以向用戶隱藏所有實現,但提供一種創建它們的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM