【5】不可变对象

版权声明:送人玫瑰,手有余香,一分也是爱 https://blog.csdn.net/m0_37156901/article/details/85914387

不可变对象,多参考 String 类和 final的写法。

在这里插入图片描述
在这里插入图片描述

修饰类看String, 修饰方法报错,重点看修饰变量和引用变量的区别

package com.mmall.concurrency.immutable;

import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**  基本变量和引用变量编译报错
 *   引用变量不可以再指向, 但是可以修改里面的值
 */
@Slf4j
public class UnmodifyVarible {

    public static final int a = 1;
    public static final String b = "2";
    public static final Map<Integer, Integer> map = Maps.newHashMap();

    static {
        map.put(1,2);
        map.put(2,5);
        map.put(3,6);
    }

    public static void main(String[] args) {
//        a = 2;
//        b = "fuck!";
//        map = new Maps.newHashMap();
//        map.put("b", "fuck!");
        map.put(1, 10100111);
        log.info("修改成功:{}", map.get(1));
    }
    private void test(final int a){
        // a = 1;
    }
}

除了这些,其实还有一些java已经提供的保证安全的方法

在这里插入图片描述

Guava – ImmutableXXX

package com.mmall.concurrency.immutable;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.nullness.qual.Nullable;

import java.util.Collections;
import java.util.Map;

/**  基本变量和引用变量编译报错
 *   引用变量不可以再指向, 但是可以修改里面的值
 */
@Slf4j
public class GuavaTest {

    public static final ImmutableList<Integer> list = ImmutableList.of(1,2,4,6,2);
    public static final ImmutableSet<Integer> set = ImmutableSet.copyOf(list);

    // map 有点特殊
    public static final ImmutableMap<Integer,Integer> map = ImmutableMap.of(1,2,3,4,5,6);
     public static final ImmutableMap<Integer,Integer> map2 = ImmutableMap.<Integer,Integer>builder().put(11,22).put(33,44).build();

    public static void main(String[] args) {
        // list.add(7);   过期--
        // set.add(3);     过期--
        // map.put(1,3);    过期--
        System.out.println(map2.get(11));
        System.out.println(map2.containsKey(33));
        System.out.println(map2.hashCode());
        System.out.println(map2.toString());
    }

}

unmodifiableXXX

package com.mmall.concurrency.immutable;

import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.Map;

/**  基本变量和引用变量编译报错
 *   引用变量不可以再指向, 但是可以修改里面的值
 */

/**
 * Exception in thread "main" java.lang.UnsupportedOperationException
 * 	at java.util.Collections$UnmodifiableMap.put(Collections.java:1457)
 * 	at com.mmall.concurrency.immutable.UnmodifyCLASS.main(UnmodifyCLASS.java:27)
 */
@Slf4j
public class UnmodifyCLASS {

    public static Map<Integer, Integer> map = Maps.newHashMap();

    static {
        map.put(1,2);
        map.put(2,5);
        map.put(3,6);
        // 去掉上面final修饰
        map = Collections.unmodifiableMap(map);
    }

    public static void main(String[] args) {

        map.put(1, 10100111);
        log.info("修改成功:{}", map.get(1));
    }

}
之前我们还回顾了一下30块钱的车,关键是要注意哪些点这里关键需要大家根据实际分析你的变量是否可以做成不可变对象,如果可以那么尽量把一个对象变成不可变对象,这样一来呢,在多线程的情况下就不会出现线程安全问题了

猜你喜欢

转载自blog.csdn.net/m0_37156901/article/details/85914387