当前位置: 首页 > 面试题库 >

使类在Java中不可变

段干靖
2023-03-14
问题内容

为了使一类不变,我可以做的是:

1)将类设为final
2)不提供设置器
3)将所有变量标记为final

但是,如果我的班级有另一个班级的另一个对象,那么somone可以更改该对象的值

class MyClass{
 final int a;
 final OtherClass other

 MyClass(int a ,OtherClass other){
  this.a = a;
  this.other = other;
 }

 int getA(){
   return a;
 }

 OtherClass getOther(){
   return other;
 }

 public static void main(String ags[]){
  MyClass m = new Myclass(1,new OtherClass);
  Other o = m.getOther();
  o.setSomething(xyz) ; //This is the problem ,How to prevent this?

}
}

问题答案:

A)也使OtherClass不可变

要么

B)不允许直接访问OtherClass对象,而是仅提供获取器以充当代理。

编辑添加:可以 制作一个深层副本OtherClass并返回一个副本,而不是原始副本,但这通常不是您在Java中期望的行为类型。



 类似资料:
  • 问题内容: 通过遵循所有Java标准,我的班级变得一成不变 这些是我在定义不可变类时所做的主要检查点。 但是还有一个问题,我的对象仍然可以通过java反射进行修改,对吗?还是我在课堂上错过了任何一点? 提前致谢。 问题答案: 没有什么可以躲藏的-即使是不可变的类也不能幸免。但是,您对此无能为力,因此“无法通过反射进行修改”不是不变性的标准之一。

  • 本文向大家介绍如何在 Java 中实现不可变类,包括了如何在 Java 中实现不可变类的使用技巧和注意事项,需要的朋友参考一下 前言 面向对象的编程通过封装可变动的部分来构造能够让人读懂的代码,函数式编程则是通过最大程度地减少 可变动的部分来构造出可让人读懂的代码。 — Michael Feathers,Working with Legacy Code 一文的作者 在这一部分中,我讨论的是函数式编

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

  • 问题内容: 在有效Java中,Bloch建议使所有字段最终成为使对象不变的对象。 是否有必要这样做?不只是不提供访问器方法就使其不可变。 例如 上述类是不可变的,即使我不申报的吗?我想念什么吗? 问题答案: 除了@Bozho的要点之外,将字段声明为意味着可以安全地访问它而无需任何同步。 相反,如果该字段不是,则存在另一个风险,即如果另一个线程在没有适当同步的情况下访问该字段,则另一个线程将看到该字

  • 由于这是一个热门的话题,这些天,我无法理解某些概念。请原谅,如果我听起来很愚蠢,但当我试图创建不可变对象时,我发现大多数帖子如下 null null 此测试用例失败并打印Cassandra。 如果我做错了什么让我知道。

  • 当我从Intellij idea运行java程序时,我注意到它们是由一个名为AppMain的类(来自idea_rt.jar)通过反射执行的。 IntelliJ产品规格: IntelliJ IDEA (Community Edition) IC-145.184.1 Build #IC-145.184, 建設於 2016 年 3 月 1 日 JRE: 1.8.0_60-b27 x86 例如:如果我执行