gpt4 book ai didi

java - 不可变类如何辨别

转载 作者:行者123 更新时间:2023-12-01 13:59:14 24 4
gpt4 key购买 nike

我理解的不可变是指它是一个对象,在实例化之后就不会改变状态。但是在这行代码中,声明数组值时我没有看到 Final 。这个类是不可变的吗?谁能解释一下如何找出来。谢谢

public class A {
private double[] values;
public double[] getValues(){
return values;
}
}

最佳答案

正如其他人所写的,该对象被认为其状态是可变的。它的不可变之处在于你不能交换它所保存的数组。但您可以更改数组的内容 (getValues()[0] = 10;)。

要将其转换为不可变对象(immutable对象),您必须使用 List 而不是数组。通过列表,您可以使用 Collections '方法unmodifiableList将给定列表转换为可以保存地公开给外部的版本。如果 getValues() 的调用者在不可修改的列表上使用添加或删除,则会导致 UnsupportedOperationException ,从而使您的对象保存不被修改。

如果您需要坚持使用数组,则需要提供数组的副本 (System.arraycopy) 或克隆 (clone())。

通常,如果您无法更改对象的属性(包括从父类(super class)继承的属性),则该对象被认为是不可变的。这通常也包括属性值,但这是一个模糊的定义。

例如,如果您有一个类,其中包含一个指向文档文件的 File 实例,并且该 File 实例无法更改,则该类被认为是不可变的(它提供的信息永远不会更改),但它指向的文档可以每次都会发生突变和改变。所以它实际上是一条模糊的线(请记住,在您的示例中,您不能更改数组,但可以更改数组的内容)。

关于java - 不可变类如何辨别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19433000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com