簡體   English   中英

使用Enum或String作為靜態工廠方法?

[英]Use Enum or String for a static factory method?

使用enumString調度到正確的對象以在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.

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