版权声明:送人玫瑰,手有余香,一分也是爱 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));
}
}