在java中实现不可变类的教程

122 阅读2分钟

这篇文章涵盖了一个关于

  • 在java中不可变的对象
  • 用java 14创建不可变的
  • 如何用可变的引用创建不可变的类

什么是java中的不可变类? 不可变类是指一旦创建了类的实例,其内容/状态就不能被改变。

每个对象都有实例成员变量和方法来改变其状态。有实例成员的不可变类不会通过方法改变其状态。它是在使用构造函数创建对象时改变对象的状态。

不可变的类的设计准则是

以下是使类成为不可变的所要遵循的规则

  • 将类声明为final,以防止它被其他类扩展。

  • 类的所有方法都应该是最终的

  • 设置器是不允许的

  • 实例成员变量应该是私有的final

  • 任何不允许的方法

  • 所有的实例变量都是用构造函数初始化的。

如何在java中创建一个不可变的类?

以下是使任何类成为不可变的一系列步骤

这里是java中的不可变类定义

public final class User{

    private final int id;
    private final String name;
    public User(int id, String name)
    {
        this.id = id;
        this.name=name;
    }
    public int getId(){
        return id;
    }
    public String getName(){
        return name;
    }
    public static void main(String args[]){
    	System.out.println("Hello");
    }
}

不可变类的优点

  • 允许类在并发使用时是线程安全的,不允许改变其状态

  • 这将是一个有用的缓存目的,因为它第一次创建的对象具有默认状态,此后不会再改变状态。

  • 它允许不扩展或子类的继承。

如何在java 14版本中创建一个不可变的类

在java 14版本中,你可以轻松地创建一个不可变的类。

record 是一个适用于java类的关键字,它没有实例变量。

public record User (id name, String name){
    this.id =id;
    this.name = name;
    public String getName() {
    return name;
  }
}

记录类的特点

  • 它是最终类,不能有子类
  • 它可以有实例方法,静态类
  • 不需要实现构造函数
  • 不需要实现 equals, hashcode 和 toString。

如何用不可变的对象列表创建不可变的类。

比如说,用户对象包含多个角色。

这里的用户类是不可变的类 角色是可变的类

下面是一个关于不可变类引用可变对象的例子

import java.util.List;
import java.util.ArrayList;

final class User
{
    final int id;
    final String name;
    final List roles;
    Immutable(int id,String name,List roles)
    {
        this.id=id;
        this.name=name;
        this.roles=roles;
    }

    public List getRoles()
    {
        List roles=new ArrayList<>(this.roles);
        return roles;
    }

}
class Role implements Cloneable
{
    String name;
    Role(String name)
    {
        this.name=name;
    }
}