我理解不可变意味着它是一个实例化后不会改变状态的对象。但在这行代码中,我看不到数组值何时被声明为Final。这个类是不变的吗?谁能解释一下怎么找到答案吗。谢谢
public class A {
private double[] values;
public double[] getValues(){
return values;
}
}
A a = new A();
a.getValues()[0] = 1.2;
只要值不为空,这将起作用。但是,您将无法将值重新分配给新数组。即:a.getValues()=新的双精度[5]
将不起作用。
这个类不是一成不变的,因为我可以更改值,只是不能重新分配它。
是的,粘贴的代码没有任何关联的final关键字,也没有不可变的行为。
好吧,我想提出一些与在java中编写不可变类相关的关键指南:
1)确保类不能被重写-使类成为最终类,或使用静态工厂并保持构造函数私有
2.)使字段私有和最终强制调用者在单个步骤中完全构造一个对象,而不是使用无参数构造函数结合后续对setXXX方法的调用(即避免JavaBeans约定)
3)不要提供任何可以以任何方式更改对象状态的方法-不仅仅是setXXX方法,而是任何可以更改状态的方法
4.)如果类有任何可变对象字段,那么当它们在类和它的调用者之间传递时,它们必须被防御复制
正如其他人所写,这个对象被认为在其状态下是可变的。它不变的是,您不能交换它所持有的数组。但是可以更改数组的内容(getValues()[0]=10;)。
要将其转换为不可变对象,必须使用列表而不是数组。有了List,您可以使用Collections的方法unmodifiableList将给定的列表转换为可以保存在外部的版本。如果getValues()的调用者在不可修改的列表上使用add或remove,则会导致不支持的PertioneException,从而阻止修改对象save。
如果需要坚持使用阵列,则需要提供阵列的副本(System.arraycopy)或克隆(clone())。
如果不能更改对象的属性(包括从超类继承的属性),则通常认为对象是不可变的。这通常也包括属性值,但这是一个模糊的定义。
例如,如果您有一个类,其中包含一个指向文档文件的文件实例,并且该文件实例不能更改,则该类被认为是不可变的(它提供的信息从不更改),但它指向的文档可以每次进行变异和更改。因此,实际上这是一条模糊的线(请记住,在您的示例中,您不能更改数组,但可以更改数组的内容)。
问题内容: 我想继承不可变类型或实现自己的一种,其行为类似于以下控制台会话所示: 毫不奇怪,对象没有方法,但应用于对象并不会导致错误,相反,它显然会创建一个新对象,并且还以某种方式神奇地将其重新分配为扩充赋值语句中给出的名称。 是否可以创建一个内置的不可变类的用户定义类或子类,并且可以这样做? 问题答案: 使用的返回值。您无需返回要添加到的对象;您可以创建一个新的并将其返回。实际上,如果对象是不可
本文向大家介绍如何在 Java 中实现不可变类,包括了如何在 Java 中实现不可变类的使用技巧和注意事项,需要的朋友参考一下 前言 面向对象的编程通过封装可变动的部分来构造能够让人读懂的代码,函数式编程则是通过最大程度地减少 可变动的部分来构造出可让人读懂的代码。 — Michael Feathers,Working with Legacy Code 一文的作者 在这一部分中,我讨论的是函数式编
问题内容: 我对什么是不可变类型感到困惑。我知道该float对象被认为是不可变的,在我的书中有这样的例子: 由于类的结构/层次结构,这是否被认为是不可变的?意思float是在类的顶部,是它自己的方法调用。类似于此类示例(即使我的书说的dict是可变的): 可变的东西在类内部具有方法,例如以下类型: 另外,对于最后一个,如果我将这种类型的set传递给它: 不调用该example方法,它返回一个字典。
问题内容: 我找到了一篇有趣的代码文章: 我真的很好奇了解创建此类的优势。我知道这里的此类对象是不可变的,因为一旦初始化就无法更改其变量值。我以前从未做过这样的事情,而且我真的不了解它的优势。 为什么是个好习惯? 您能说出可以使用这种方法的情况吗? 常量或只读变量呢?那不是很相似吗? 在文章中说,这不利于应用程序的性能。 但是为什么 呢? 问题答案: 您提到的示例是不可变对象。它在编程语言中被广泛
本文向大家介绍Python的可变类型和不可变类型?相关面试题,主要包含被问及Python的可变类型和不可变类型?时的应答技巧和注意事项,需要的朋友参考一下 可变数据类型:列表、字典、可变集合 不可变数据类型:数字、字符串、元组、不可变集合
考虑一段代码: