温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何判断对象不可变

发布时间:2026-10-01 17:58:26 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在编程中,“对象不可变(immutable)”通常指对象在创建后,其状态(字段/属性)不能被修改。判断一个对象是否不可变,可从“定义层面”和“运行层面”两个维度来看。


一、定义层面:代码特征判断

1. 所有字段为 final(Java 示例)

public final class Point {
    private final int x;
    private final int y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
  • final 保证引用/值不能重新赋值
  • 类为 final 防止子类破坏不变性

2. 不提供 setter / 修改方法

  • 没有 setX()
  • 没有 add()、clear() 等改变状态的方法

3. 不暴露可变内部状态

// 错误示例
public List<String> getList() {
    return this.list; // 外部可修改
}

// 正确示例
public List<String> getList() {
    return Collections.unmodifiableList(this.list);
}

4. 字段类型本身也不可变

  • 使用 String、Integer、LocalDate
  • 避免 Date、ArrayList(除非防御性拷贝)

二、运行层面:行为判断

1. 修改操作是否抛出异常

List<String> list = List.of("a");
list.add("b"); // UnsupportedOperationException

→ 不可变

2. 多次读取结果是否一致

obj.getX() == obj.getX() // 永远相同

3. 是否“修改即新建”

String s = "a";
s = s.concat("b"); // 新对象

→ 原对象未变


三、语言层面常见不可变类型

语言 不可变示例
Java String, Integer, Record, List.of()
Python tuple, str, frozenset
JS Object.freeze()
Scala case class(默认)

四、一个简单判断口诀

看三件事:

  1. 能不能改(无 setter)
  2. 改了是不是新对象(返回新实例)
  3. 内部数据能不能被外部改(无引用泄露)

如果你指的是某一门语言或具体场景(如 Java / Python / 并发安全),我可以给出更针对性的判断方法。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手