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

相关文章
相关标签/搜索