簡體   English   中英

將Java Enum值鏈接到動態實例化的對象

[英]Link Java Enum values to dynamically instantiated objects

我的Java 8應用程序中有一個代碼異味,我希望通過重新設計來解決。

我聲明了一個Enum DataType ,它不僅包含枚舉值,而且還基於某些邏輯包含這些枚舉值的有序列表。 總而言之,每個枚舉值聲明一組與其他枚舉值(相同類型)的依賴性,並且該列表是這些枚舉值的拓撲排序列表 每個枚舉值還具有與之關聯的Calculator

public Enum DataType
{
    A(EnumSet.noneOf(DataType.class), new CalculatorA()),
    B(EnumSet.of(A), new CalculatorB()),
    C(EnumSet.noneOf(DataType.class), new CalculatorC()),
    D(EnumSet.Of(A,B,C), new CalculatorD()),
    ... more ...

    ...constructor and attributes...

    public static final List<DataType> DATA_TYPES_SORTED_BY_DEPENDENCIES;

    static
    {
        DATA_TYPES_SORTED_BY_DEPENDENCIES = ...
    }
}

我知道枚舉是自然排序的(常規的),因此通過以正確的順序聲明枚舉,就無需進行任何排序。 但是,枚舉值的數量很大,並且會隨時間變化。 我不想自己維護正確的順序,如果我只是聲明依賴項,我希望程序為我自己做。 它也是自我解釋的代碼,因為明確提到了某些依賴項存在並且已對其進行排序。

我的程序的目標是以正確的順序在一組記錄上運行計算器,因此為什么要對枚舉進行排序:

for(Record r : records)
{
    for(DataType type : DataType.DATA_TYPES_SORTED_BY_DEPENDENCIES)
    {
        Integer result = type.getCalculator().calculate(r);
        r.getDataMap().put(type, result);
    }
} 

此設置運行正常,直到要求對可在參數枚舉類中靜態實例化的計算器進行參數化。 參數將來自Web服務或數據庫調用。 我必須在枚舉之外實例化Calculator類,而現在我已經失去了枚舉類型和計算器之間的聯系。

為了解決這個問題,我創建了一個HashMap以便於檢索:

    ...get some parameters from another service...

    Map<DataType, Calculator> calculatorsByTypeMap = new HashMap<>(400);

    calculatorsByTypeMap.put(DataType.A, new CalculatorA(someParameterA));
    calculatorsByTypeMap.put(DataType.B, new CalculatorB());
    calculatorsByTypeMap.put(DataType.C, new CalculatorC(someParameterC1, somereParameterC2));
    calculatorsByTypeMap.put(DataType.D, new CalculatorD(someParameterD));
    ...

    return calculatorsByTypeMap;

這讓我感到困擾,因為我在概念上兩次聲明了我的(相當大的)枚舉:一次用於排序邏輯,一次用於與計算器的鏈接。 有辦法防止這種情況嗎?

使用空計算器字段構建枚舉。 在運行時,進行拓撲排序並構建排序列表。 獲取新的計算器並在枚舉中設置計算器值。

暫無
暫無

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

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