2016-09-15 45 views
-1

在下面的例子中,Enums做了一個類可以處理的數量。使用處理邏輯枚舉實現是否很好?

enum TriggerHandlerType { 
    DASHBOARD { 
     @Override 
     TriggerHandler create() { 
      return new DashboardTriggerHandler(); 
     } 
    }, 
    COMPONENT_HANDLER { 
     //... 
    }; 

    abstract TriggerHandler create(); 
} 

private static TriggerContext getTriggerContext(TriggerHandlerType triggerHandlerType) throws TriggerHandlerException { 
    return new TriggerContext(triggerHandlerType.create()); 
} 

枚舉通常用於其中在這種情況下,他們將基於處理邏輯返回變化值常數的類型安全儲存。從某種程度上說,它似乎是一種綜合性的技術,因爲這裏的枚舉是通過狀態確定本身來減輕類的處理。此外,由於返回值是有限值的一個子集,因此讓枚舉本身處理處理似乎是有意義的。

我在這裏看到的問題在那裏,這將打破開閉原則SOLID和階級將有更多的時枚舉被添加的代碼行增量,任何人都可以分享您對此怎麼看?

+1

這取決於上下文,在這種情況下,這是一個可怕的想法。 –

+0

@DavidPérezCabrera感謝您的評論,我在Github看到了這段代碼,並認爲它會真正緩解實現,而不是具有不同的具體類或切換案例或hashmaps,爲什麼你認爲它很糟糕!任何特定的原因 –

+0

@RealSkeptic我同意!,我從github那裏拿走了它,並且創建了一個只是看一看希望現在有意義 –

回答

0

我有一個枚舉正因爲如此,做這樣或操作,並且,序列和這樣所有的人都有效。

使用java 8和只有一個重寫方法,你也可以使用一個函數接口作爲參數的構造函數。

enum TriggerHandlerType { 
    DASHBOARD(() -> DashboardTriggerHandler::new)), 
    COMPONENT_HANDLER (() -> { ... }); 

    private final Fun fun; 

    private TriggerHandlerType(Fun fun) { 
     this.fun = fun; 
    } 

    public TriggerHandler create() { 
     fun.apply(); 
    } 
} 

在另一種情況下,我沒有使用這種技術來分離類,並且有明確的類層次。枚舉是一個早期的課程,尚未使用後​​期課程。

A 從枚舉到處理程序的映射也是OO。單元測試可能會檢查創建的映射的大小等於枚舉值。

我不需要說,枚舉是一個人工耦合。固定數量的元素與否,可以使單獨分類/單身

所以它取決於。