出現場景:在枚舉類中,定義一個私有靜態變量,MAP來存儲Enum中的全部值,而後在其餘類中 使用這個靜態變量的值...java
public enum DemoEnum { ELE_1(1, "元素1"), ELE_2(2, "元素2"), ELE_3(3, "元素3"); private int value; private String desc; private static Map<Integer, DemoEnum> MAP = new HashMap<>(); // 靜態代碼塊 static { for (DemoEnum demoEnum : DemoEnum.values()) { MAP.put(demoEnum.getValue(), demoEnum); } } /** * 獲取 靜態 MAP的 keySet集合, * 並且remove keySet中變量 會移除MAP中的元素 * @return */ public static Set<Integer> getEnumValues(){ return MAP.keySet(); } /** * 把keySet 處理成List,就變成普通變量了, * 方法執行完畢就會銷燬 * @return */ public static List<Integer> getEnumValueList(){ List<Integer> integerList = Arrays.asList(MAP.keySet().toArray(new Integer[MAP.size()])); ArrayList<Integer> list = new ArrayList<>(); for (Integer integer : integerList) { list.add(integer); } return list; } DemoEnum(int value, String desc) { this.value = value; this.desc = desc; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
public class ApplicationTest3 { public static void main(String[] args) { // Set 集合中的值 [1, 2, 3] for (int i = 1; i < 3; i++) { test1(i); } } public static void test1(Integer var) { // List<Integer> enumValues = DemoEnum.getEnumValueList(); // 使用這個方法時,每次進來時size都=3 Set<Integer> enumValues = DemoEnum.getEnumValues();// 第一次進來時size=3,第二次進來是size=2 if (var % 2 != 0) { enumValues.remove(Integer.valueOf(1)); } else { enumValues.remove(Integer.valueOf(2)); } System.out.println(enumValues); // 輸出的元素 只有一個 } }
注意要點: static 變量在內存中只存在一份, 對Map.keySet() 操做 一樣會對Map產生影響this
MAP是靜態的,Set<Integer> values = MAP.keySet() 指向的一樣是static MAP。 把Set<Integer> values 轉換成List能夠解決兩次操做的都是同一變量的問題...code