Java不可变类

作者: SHAN某人 | 来源:发表于2018-08-20 19:42 被阅读13次

1. 什么是不可变类?

可变类 不可变类
可变类的实例创建后可以改变其成员变量的值。 类的实例一旦创建后,不能改变其成员变量的值。

2. 如何创建不可变类?

2.1通过 Collections.unmodifiable*** 创建不可变类
 private  static  Map map = new HashMap<>();
    static {
        map.put("shan",1);
        map.put("li",1);
        map.put("zhang",1);
        map =  Collections.unmodifiableMap(map);
    }
2.2 通过 第三方包guava的 Immutable**** 创建不可变类
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.0</version>
        </dependency>
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
// 线程安全
public class ImmutableExample3 {

    private final static ImmutableList<Integer> list = ImmutableList.of(1, 2, 3);

    private final static ImmutableSet set = ImmutableSet.copyOf(list);

    private final static ImmutableMap<Integer, Integer> map = ImmutableMap.of(1, 2, 3, 4);

    private final static ImmutableMap<Integer, Integer> map2 = ImmutableMap.<Integer, Integer>builder()
            .put(1, 2).put(3, 4).put(5, 6).build();


    public static void main(String[] args) {
        System.out.println(map2.get(3));
    }
}

3. 如何设计不可变类?

  • 将类声明为final,所以它不能被继承
  • 将所有的成员声明为private final,这样就不可直接访问和修改
  • 任何获取/修改属性的方法都不应作用于属性本身。
    • 对变量不要提供setter方法
    • 将所有可变的成员声明为final,这样只能对它们赋值一次
    • 通过构造器初始化所有成员,进行深拷贝(deep copy)
  • 在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝

待补充,待完善,待深入

相关文章

  • Java中的不可变类

    什么叫不可变类? 《Effective Java》将不可变类定义如下: An immutable class is...

  • java中的不可变类及其创建规则

    java中的不可变类及其创建规则 不可变类顾名思义就是这个类被实例化之后不可被重新赋值,java提供的八个包装类和...

  • Java专题之String

    一、String简介 1.1 String是不可变对象 java.lang.String类使用了final修饰,不...

  • Java 中String 类的不可变性与字符串拼接解析

    @TOC 一、String 类是不可变的 1.1 不可变的原因 在Java 中,对于String 类的定义如下: ...

  • Java之StringBuilder

    Java中的StringBuilder表示可变的字符序列。由于Java中的String类会创建不可变的字符序列,因...

  • Java的不可变类(缓存实例)

    不可变类 不可变类的意思是在创建该类的实例后,该实例的实例变量是不可以改变的。Java提java.lang.Str...

  • 可变字符串类和日期相关类

    来自拉钩教育-JAVA就业集训营 可变字符串类和日期相关类 可变字符串类(重点) 基本概念 由于String类描述...

  • Java不可变类

    1. 什么是不可变类? 2. 如何创建不可变类? 2.1通过 Collections.unmodifiable**...

  • Java不可变类

    0. 几个问题 什么是不可变类? 不可变类的优缺点是什么? 常见的不可变类有哪些?String为什么要设计成不可变...

  • JAVA不可变类

    一、不可变类简介不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的...

网友评论

    本文标题:Java不可变类

    本文链接:https://www.haomeiwen.com/subject/cmrciftx.html