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