[英]Using Enum to store constants and use those constants in multiple classes
我目前正在編寫解決旅行商問題的遺傳算法。 我在多個地方使用了一些“常量”。 但是,這些值需要預先計算,因此,我無法將它們存儲到私有靜態最終變量中。 因此,我決定使用枚舉。
public enum Constants {
NODE_COUNT(0),
SEQUENCE_LENGTH(0),
POPULATION_SIZE(0),
MAX_EDGE_WEIGHT(0),
MUTATION_RATE(0);
private int value;
private boolean alreadySet = false;
Constants(int value) {
this.value = value;
}
public void setValue(int value) {
if (!alreadySet) {
this.value = value;
this.alreadySet = true;
} else {
throw new AssertionError("Value is already set.");
}
}
public int get() {
return value;
}
}
我的問題是,您認為這是一個好方法嗎? 我不確定這是否會降低使用枚舉的每個類的凝聚力。 提前致謝。
這對我來說似乎是一個糟糕的方法。 枚舉就像類,因此為這些計算創建專用類並沒有太大區別。 那么實際上為什么不只用這兩個字段創建典型的類而不是 Enum,將它們的實例保留為private static final
字段呢?
正如所評論的,改變值的常數不是常數。
雖然您當然可以在枚舉上存儲不斷變化的狀態,但您應該問問自己這樣做是否是個好主意。 一般不會,在我看來。 枚舉對象通常用作常量,因此命名約定全部為大寫。
Map
您可以通過使用Map
來實現具有類型安全的有限對象集(枚舉)以及更明顯地改變狀態的目標。 映射會將每個枚舉對象與自定義類型的對象配對,以包含您不斷變化的狀態。
EnumMap
EnumMap
類是Map
一種實現,它非常高效,占用很少的內存和 CPU。
這里以一些未經測試的代碼為例。
enum TravSalesAspect NODE_COUNT, SEQUENCE_LENGTH, POPULATION_SIZE, MAX_EDGE_WEIGHT, MUTATION_RATE ;
record AlgorithmState ( int val , boolean alreadySet ) {}
final Map< TravSalesAspect , AlgorithmState > map = new EnumMap<>() ;
我們的地圖是空的。 所以我們想用一些默認值進行初始化。
我們訪問所有枚舉對象的數組。 從該數組中,我們創建一個流。 對於流中的每個元素,我們將一個鍵值條目放入映射中。
Arrays.stream( TravSalesAspect.values() ).forEach( aspect -> map.put( aspect , new AlgorithmState( 0 , false ) ) ) ; // Initializing the map.
當您想稍后設置狀態時:
if( ! map.get( someAspect ).alreadySet() )
{
map.put( someAspect , new AlgorithmState( 42 , true ) ) ;
}
順便說一下,請注意,在 Java 16+ 中,如果您願意,可以在本地定義enum
和record
。
當然這里顯示的代碼不是線程安全的; 謹防。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.