Java使用Map類型靜態成員變量時,踩到的一個坑

出現場景:在枚舉類中,定義一個私有靜態變量,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

相關文章
相關標籤/搜索