你会扔一个IllegalStateException吗?如果:由于一个或多个字段的值,方法无法完成其工作这些字段是final并且只在构造函数中赋值?教科书示例:您的类是不可变的Collection并且您的方法应该返回最大元素,但此实例为空。我已阅读KevinBourillon`sblogpost关于这个主题,我不确定适用哪条规则。UnsupportedOperationException-thismeansthatthemethodinvokedwillalwaysfailforaninstanceofthisclass(concretetype),regardlessofhowthe
这个问题在这里已经有了答案:ImmutabilityofStringsinJava(26个答案)关闭7年前。Strings=...;s=s.substring(1);这可能吗?我认为您不能在Java中更改String对象。
使用immutables-library在我将module-info.java添加到项目之前,Java9可以正常工作,将不再生成Immutables*.java。我按照IntelliJ的建议在模块信息中添加“需要值”。我缺少什么,是immutables-library问题还是我需要设置的其他内容,以便javac找到注释处理。我正在使用Maven,maven-compiler-plugin:3.7.0配置为target/source=9。 最佳答案 您遇到的问题是您没有将Immutable部分配置为注解处理器,应该这样做:4.0.0e
我有一个复杂的对象,它由LCDSDataServices数据管理管理并使用自定义汇编程序创建/更新等。绝大多数对象层次结构都被正确地序列化/反序列化,但在序列化不可变Java类时我遇到了绊脚石。在只有java的世界中,我会使用javawriteReplace和readResolve方法,正如这篇优秀博客所描述的:http://lingpipe-blog.com/2009/08/10/serializing-immutable-singletons-serialization-proxy/这就是我最初编写我的java类的方式,希望livecycle调用writeReplace方法并及时将
我有一个来自“javaconcurrencypratique”一书的例子,他说volatile和不可变的持有者对象提供了线程安全性。但是我不明白书上给出的例子。代码如下:publicclassVolatileCachedFactorizerextendsGenericServletimplementsServlet{privatevolatileOneValueCachecache=newOneValueCache(null,null);publicvoidservice(ServletRequestreq,ServletResponseresp){BigIntegeri=extrac
我读了几本书,也看过几篇博客讨论返回空集合比返回null更好。我完全理解试图避免检查,但我不明白为什么返回一个空集合比返回null更好。例如:publicclassDog{privateListbone;publicListget(){returnbone;}}对比publicclassDog{privateListbone;publicListget(){if(bone==null){returnCollections.emptyList();}returnbone;}}示例一将抛出NullPointerException,示例二将抛出UnsupportedOperation异常,但
我有两个不可变类: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。