[英]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)
鑒於 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
對象。
因此,鑒於枚舉的定義,您的問題並沒有真正的意義。 一個枚舉的對象不與另一個枚舉共享。
也許您正在尋找的是枚舉對象的集合。
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.