[英]Use Enum or String for a static factory method?
使用enum
或String
調度到正確的對象以在static
工廠方法中創建是否更好?
String
示例:
public static Car createCar(String carName){
if(carName.equals("Ferrari")){
return new Ferrari();
}
else if(carName.equals("Porsche")){
return new Porsche();
}
....
}
enum
示例:
public static Car createCar(CarEnum carEnum){
if(CarEnum.FERRARI.equals(carEnum)){
return new Ferrari();
}
else if(CarEnum.PORSCHE.equals(carEnum)){
return new Porsche();
}
....
}
就目前而言,據我說:
使用enum
好處 :
carName
調用工廠。 使用Enum
缺點:
增加依賴性,因為更改為enum
(例如, FERRARI
變為ENZO_FERRARI
)將需要在客戶端上進行修改。 但是,使用String
我們可以將Ferrari
重定向到Enzo Ferrari
實例,而無需重新編譯客戶端代碼。 當然,我們可以為客戶端使用舊的enum
值和FERRARI
重定向到ENZO-FERRARI
enum
做同樣的事情,但對我而言,它意味着enum
必須保留舊值以使客戶端兼容......對我來說沒有意義。
我想知道你對這個問題有什么看法?
如果像在這種情況下那樣,對方法有一定數量的可接受參數,那么最好在方法的客戶端上盡可能地強制執行該約束。 在這種情況下,接受任何舊字符串將導致比使用枚舉更多的失敗。
但是,在這種有限的情況下,您可能還會考慮為每種類型的汽車使用命名工廠方法:如createFerrari(),createPorsche()等。
都不是。 使用Enum並使該方法成為Enum本身的實例方法。 不,如果需要的話。
我會用Enums
; 我不喜歡在這種情況下使用的字符串。 枚舉的優點是你可以切換它們(這不適用於字符串),你不需要處理錯誤的輸入。
我不會向枚舉添加實例方法。 今天我們在枚舉中使用靜態塊並引用枚舉時看到了奇怪的意外行為。 突然一個枚舉實例是空的!!! ???
我會使用抽象的工廠模式。 這樣,您可以為兩個枚舉實例使用相同的工廠。
我還會使用hashmap來存儲工廠。 這樣你就沒有這種情況,或者是否會增加循環復雜性。
enum
另一個好處是它允許你使用switch/case
語法而不是無限if/else
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.