[英]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.