当前位置: 首页 > 知识库问答 >
问题:

java我应该使instace变量类不可变吗

邵繁
2023-03-14

从…起http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html :

不要提供“setter”方法——修改字段或字段引用的对象的方法。使所有字段都是最终的和私有的。不要允许子类重写方法。最简单的方法是将类声明为最终的。一个更复杂的方法是使构造函数私有,并在工厂方法中构造实例。如果实例字段包括对可变对象的引用,不要允许更改这些对象:不要提供修改可变对象的方法。不要共享对可变对象的引用。永远不要存储传递给构造函数的外部可变对象的引用;如果需要,创建副本,并存储对副本的引用。同样,在必要时创建内部可变对象的副本,以避免在方法中返回原始对象。

一个名为员工的类有一个实例变量a,类型为地址
我的问题:应该做些什么来使这个类不可变(条件:我想从getMap()getter返回相同的实例变量a)。
我应该使地址类不可变吗?

注意:我理解防御性副本,但不想使用此副本

共有3个答案

孟光耀
2023-03-14

是的,如果要返回存储在字段a中的同一个实例,您的Address类需要是不可变的,以便使Employee类不可变。

如果您愿意创建存储在字段a中的实例的副本并返回该副本,则不必如此。

皇甫繁
2023-03-14

一个名为Employee的类有一个类型为Address的实例变量。我的问题是:应该如何使这个类不可变(条件:我想从getAddress()getter返回相同的实例变量A)。

如果希望在getter中返回完全相同的变量,则不能在那里使用copy。但是也许你应该为Address类实现equals()方法?这似乎比依赖实例平等要好得多。那你就可以用复印件了,而且很开心。

我应该使地址类不可变吗?

这是你想做什么就做什么的唯一方法。但仍然需要使地址的文件不可变。字符串在默认情况下是不可变的,如果您想返回其他内容,那么就需要使用防御性副本。

鲍理
2023-03-14

您可以将address of employee作为最终变量,因此必须在构造函数完成执行之前对其进行实例化。所以您可以修改employee的构造函数,使其始终采用address param n inits实例地址变量。一旦设置好,你就不能将新地址obj分配给已经存在的init address变量。

 类似资料:
  • 只是在列表下面迭代 以上三个迭代有什么区别

  • 问题内容: 我找到了一篇有趣的代码文章: 我真的很好奇了解创建此类的优势。我知道这里的此类对象是不可变的,因为一旦初始化就无法更改其变量值。我以前从未做过这样的事情,而且我真的不了解它的优势。 为什么是个好习惯? 您能说出可以使用这种方法的情况吗? 常量或只读变量呢?那不是很相似吗? 在文章中说,这不利于应用程序的性能。 但是为什么 呢? 问题答案: 您提到的示例是不可变对象。它在编程语言中被广泛

  • 本文向大家介绍python不可变变量?相关面试题,主要包含被问及python不可变变量?时的应答技巧和注意事项,需要的朋友参考一下 不可变对象是指不可以被引用改变的对象,如字符串 #

  • 问题内容: 为了使一类不变,我可以做的是: 1)将类设为final 2)不提供设置器 3)将所有变量标记为final 但是,如果我的班级有另一个班级的另一个对象,那么somone可以更改该对象的值 问题答案: A)也使不可变 要么 B)不允许直接访问对象,而是仅提供获取器以充当代理。 编辑添加: 您 可以 制作一个深层副本并返回一个副本,而不是原始副本,但这通常不是您在Java中期望的行为类型。

  • 我应该在Java EE中将注入的变量声明为瞬态变量吗? 我收到FindBugs警告: 类com.playaround.HelloServlet定义了非瞬态非序列化实例字段加速单元 这个序列化类定义了一个非基元实例字段,它既不是瞬态的、序列化的,也不是java.lang.的对象,并且看起来没有实现外部化接口或readObject()和WriteObject()方法。 如果非序列化对象存储在这个字段中

  • 问题内容: 我现在已经实现了一些Java应用程序,到目前为止仅实现了桌面应用程序。我更喜欢使用不可变对象在应用程序中传递数据,而不是使用带有变量(setter 和getter )的对象,也称为JavaBeans。 但是在Java世界中,使用JavaBeans似乎更为常见,而且我不明白为什么应该使用JavaBeans。就个人而言,如果代码仅处理不可变的对象而不是始终改变状态,则代码看起来会更好。 在