这篇文章涵盖了一个关于
- 在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;
}
}