簡體   English   中英

如何將 map 枚舉到具有相同鍵的枚舉

[英]How to map enum to enum with the same keys

如何使用 Java 中的相同鍵將 map 枚舉到枚舉。 例如..

public enum FirstEnum {
 A, B
} 

public enum ScndEnum {
 A, B, C
} 

我找不到好的解決方案

您不能 map 直接從一種枚舉類型到另一種枚舉類型,但您可以使用name()的值和 map 使用valueOf() 這兩種方法都帶有所有枚舉類:

ScndEnum aToA = ScndEnum.valueOf(FirstEnum.A.name());

如果你想讓它通用:

private static <E extends Enum<E>, F extends Enum<F>> 
    F mapEnum(E enum1, Class<F> enum2Class) {

    return Enum.valueOf(enum2Class, enum1.name());
}

您可以使用類似

ScndEnum b = mapEnum(FirstEnum.B, ScndEnum.class)

tl;博士

鑒於 Java 中枚舉的定義,在枚舉之間共享對象實際上沒有意義。

也許您的解決方案是一組枚舉,例如Map鍵值對),其中鍵類型是一個枚舉 class,值類型是另一個枚舉 ZA2F2ED4F8EBC2CBB4C21A29DC40AB6ZD。

Map< Animal , Food > feeding = 
    Map.of
    (
        DOG , MEAT ,
        CAT , MEAT ,
        BIRD , SEED ,
        BAT , FRUIT
    )
;

枚舉是一種數據類型

Java 中的枚舉是一個 class 實例,在編譯時為其命名,在運行時自動實例化,並且不能重新分配。 請參閱Oracle 的教程

例子:

enum Animal { DOG , CAT , BIRD , BAT ; }

enum Flavor { VANILLA , CHOCOLATE , LAVENDER , LEMON ; }

枚舉中的每個名稱都將被分配一個 object,這是該枚舉的 class 的一個實例。 在上面的示例中, DOG常量包含Animal object,而LEMON常量包含Flavor object。

當您擁有在編譯時已知且在運行時不變的特定實例集合時,在 Java 中使用枚舉是有意義的。 這意味着您不能在上面的示例中調用new Animal() 當 class 首次加載時,四個新的Animal對象被自動實例化並分配給每個變量名稱。 在枚舉 class 加載之后,不能再實例化或丟棄更多Animal對象。

枚舉之間不共享

因此,鑒於枚舉的定義,您的問題並沒有真正的意義。 一個枚舉的對象不與另一個枚舉共享。

Collections

也許您正在尋找的是枚舉對象的集合

Set

例如,這里我們使用為保存枚舉對象高度優化的Set實現: EnumSet

Set< Animal > furryPets = EnumSet.of( DOG , CAT ) ;
Set< Animal > flyingAnimals = EnumSet.of( BIRD , BAT ) ;
Set< Animal > featheredFlyingAnimals = flyingAnimals.clone().remove( BAT ) ;

Map

你提到想要一個雙向映射。 所以也許你想要的是一個Map來跟蹤一個枚舉作為鍵和另一個枚舉作為值。 EnumMap class 針對您的密鑰是枚舉進行了高度優化。

例如,讓我們添加另一個枚舉。

enum Food { MEAT , SEED , FRUIT ; }

Map 一種動物對其食物的類型。

Map< Animal , Food > feeding = new EnumMap<>( Animal.class ) ;
feeding.put( DOG , MEAT ) ;
feeding.put( CAT , MEAT ) ;
feeding.put( BIRD , SEED ) ;
feeding.put( BAT , FRUIT ) ;

檢索要喂給蝙蝠的食物類型。

Food foodForBats = feeding.get( BAT ) ;

成員變量

Java 中的枚舉是一種特殊的 class,但仍然是 class。 所以枚舉可以有成員字段、構造函數和訪問器方法,就像常規的 Java 類一樣。

因此,我們可以通過使用成員字段、構造函數和訪問器方法,以這種方式將Animal與其Food關聯起來。

enum Animal 
{
    DOG( Food.MEAT ) , 
    CAT( Food.MEAT ) , 
    BIRD( Food.SEED ) , 
    BAT( Food.FRUIT ) ;

    // Member fields.
    private Food food ;

    // Constructor.
    private Animal( Food foodArg ) 
    {
        this.food = foodArg ;
    }

    // Accessor "getter" method.
    public Food getFood() { return this.food ; }

}

如上所述,當Animal class 加載時,它的構造函數被調用四次,每個命名常量一次。 代表您將指定的Food object 自動傳遞給該構造函數。 你可以把這條線DOG( Food.MEAT ),public static final Animal DOG = new Animal( Food.MEAT);的縮寫。 .

用法。

Food foodForBats = Animal.BAT.getFood() ;

暫無
暫無

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

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