簡體   English   中英

使用 Enum 存儲常量並在多個類中使用這些常量

[英]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+ 中如果您願意,可以在本地定義enumrecord

當然這里顯示的代碼不是線程安全的; 謹防。

暫無
暫無

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

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