我有两个不可变类:User和Department,它们使用双向关联连接-User引用了Department和Department有一个User列表。如何使用提供的用户创建一个新的部门实例?代码:classUser{privatefinalDepartmentdepartment;privatefinalStringname;publicUser(Departmentdepartment,Stringname){this.department=department;this.name=name;}}classDepartment{privatefinalListusers;private
假设我有一个表示复数的简单接口(interface),它的实例是不可变的。为了简洁起见,我省略了明显的plus、minus、times和divide方法,它们只会创建并返回一个新的不可变实例。publicinterfaceComplex{doublereal();doubleimaginary();doubleabsolute();doubleangle();}现在的问题是,将其实现为不可变类的最佳方法是什么?最简单直接的“我只在性能出现问题时才关心它”的方法是将实部和虚部存储为最终字段,并在每次调用这些方法时计算绝对值和角度。这使类保持小而简单,但显然最后两个方法每次都返回相同的结果
要使类不可变,我可以做的是:1)使类最终2)不提供setter3)将所有变量标记为final但是如果我的类有其他类的另一个对象,那么有人可以更改该对象的值classMyClass{finalinta;finalOtherClassotherMyClass(inta,OtherClassother){this.a=a;this.other=other;}intgetA(){returna;}OtherClassgetOther(){returnother;}publicstaticvoidmain(Stringags[]){MyClassm=newMyclass(1,newOtherCl
在java中,BigInteger是不可变的,但我想了解为什么,因为很多时候它被用来进行大量计算,从而产生大量对象。所以,不让它不可变感觉有点直观。我想到的情况类似于字符串操作,然后是StringBuilder的选项。是否应该有BigInteger的不可变对应物?我认为它在很多情况下都可能是有益的。编辑:我知道不变性的好处以及它在许多情况下的好处。我只是想了解BigInteger的好处。我已经使用BigInteger来计算大数的阶乘。所以,我更喜欢可变的BigInteger。同样,BigInteger将用于结果比int大得多的计算。对于其他情况,有BigDecimal。
我想在clojure中包装java的PriorityQueue类,以便在我的程序的另一部分中使用。我想弄清楚的是,是否有任何方法可以以lispy方式执行此操作并使优先级队列不可变。有什么好的方法可以做到这一点,还是我只是将PriorityQueue用作可变数据结构会更好? 最佳答案 我认为没有一种简单的方法可以将可变数据结构包装为不可变数据结构。当新版本可以巧妙地与旧版本共享数据时,不可变数据结构变得高效,如果不访问PriorityQueue的内部结构,我真的看不出如何做到这一点。如果你真的想要一个持久化的优先队列thisthrea
是否有可能在任何给定时刻使变量final?我想决定什么时候它是不可变的,而不仅仅是第一次分配。如果null不算作赋值就完美了。因此,如果您用null初始化它,您仍然会有一个通配符用于某些代码后的第一个赋值,不一定在构造函数中。 最佳答案 一旦你分配了一个final变量,你就永远不能改变它的值,如here所述:Afinalvariablecanonlybeinitializedonce,eitherviaaninitializeroranassignmentstatement.Itdoesnotneedtobeinitializeda
我有一种预感,即使用holder惯用法而不将holder字段声明为final不是线程安全的(由于不变性在Java中的工作方式)。有人可以证实这一点(希望有一些消息来源)吗?publicclassSomething{privatelonganswer=1;privateSomething(){answer+=10;answer+=10;}publicintgetAnswer(){returnanswer;}privatestaticclassLazyHolder{//noticenofinalprivatestaticSomethingINSTANCE=newSomething();}p
我有一个不可变对象(immutable对象),例如笛卡尔空间中的一个节点。该类是不可变的,因此我缓存了hashCode以实现非常快速的散列。privatefinalinthashCode;privatefinaldoublex,y,z;publicNode(finaldoublex,finaldoubley,finaldoublez){this.x=x;this.y=y;this.z=z;this.hashCode=Objects.hashCode(this.x,this.y,this.z);}@Overridepublicbooleanequals(finalObjectobj){i
这个问题在这里已经有了答案:WhyistheStringclassdeclaredfinalinJava?(16个答案)关闭9年前。有人告诉我这是Java中重要的字符串面试问题,它首先讨论“什么是字符串”,Java中的字符串与C或C++中的字符串有何不同,然后你被问及不可变对象(immutable对象),你是问了主要问题:“为什么String在Java中是不可变的或最终的”。你能分享你的想法吗?提前致谢。
我想构建一个不可变树数据结构,表示文件系统目录结构的任意子集。通常会有一个知道包含/排除的过滤器,我基本上希望在构造中有一些线程支持。这听起来像是我自己编写代码的纯粹Nerd乐趣,但我实际上想知道是否有关于此主题的任何好的示例、文本或类似内容?源代码很好;) 最佳答案 这本书有所有的答案:http://www.amazon.co.uk/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504 关于java-java中多线程构造不可变