已经阅读了如何通过以下步骤使类不可变不要提供“setter”方法——修改字段或字段引用的对象的方法。将所有字段设为最终字段和私有(private)字段。不允许子类覆盖方法。最简单的方法是将类声明为final。一种更复杂的方法是将构造函数设为私有(private)并在工厂方法中构造实例。如果实例字段包含对可变对象的引用,则不允许更改这些对象:一种。不要提供修改可变对象的方法。b.不要共享对可变对象的引用。永远不要存储对传递给构造函数的外部可变对象的引用;如有必要,创建副本并存储对副本的引用。同样,必要时创建内部可变对象的副本,以避免在方法中返回原始对象。我不确定我是否清楚地理解私有(pr
我使用GitHub的Immutables用于Android开发的库,现在我也想在后端尝试一下。在Android中,为了使用这个库,我需要做的就是:dependencies{compilefileTree(dir:'libs',include:['*.jar'])//immutableentitiesgenerationprovided"org.immutables:value:2.5.5"//forannotationsprovided"org.immutables:builder:2.5.5"//forannotationsprovided"org.immutables:gson:2
在从事游戏项目时,我开始使用Java中的不可变值对象,遵循“公共(public)最终字段”方法:publicclassTeam{publicfinalStringname,flag;publicTeam(Stringname,Stringflag){this.name=name;this.flag=flag;}}到目前为止,这对我来说效果很好,但在不同的情况下,我需要关于团队的不同的额外信息集。例如,一支球队在比赛中有固定的颜色。问题是,处理这些扩展信息集的最佳方式是什么?我知道这是一个相当普遍的问题,但我想继续使用不可变对象(immutable对象),这可能会影响解决方案。这是我想出
Java字符串是不可变的,用相同的值实例化多个字符串返回相同的对象指针。(对此有一个术语吗?“池化”似乎很合适,但这已经指的是进行缓存以通过减少实例化来节省时间。)Java是否也对其他不可变的(用户定义的)类执行此操作(没有术语)?Java甚至可以检测到一个类是不可变的,或者这是字符串类所独有的东西? 最佳答案 写信。字符串,你要找的词是interning.Java不会为您自己的不可变对象(immutable对象)执行此操作。不过,它确实有盒装原语的缓存版本。请参阅wrapperclasscaching上的这篇文章了解更多信息。
Builder实现了Cloneable并覆盖了clone()并且不复制构建器的每个字段,不可变类保留了构建器的私有(private)克隆。这使得返回新构建器和创建不可变实例的稍微修改的副本变得容易。我可以这样走MyImmutablei1=newMyImmutable.Builder().foo(1).bar(2).build();MyImmutablei2=i1.builder().foo(3).build();据说Cloneable接口(interface)有些损坏,但这是否违反了良好的Java编码实践,这种构造是否存在任何问题?finalclassMyImmutable{publi
我正在hibernate中创建一个CompositeUserType以将EAST和NORTH字段映射到坐标对象。目前,我的Coordinate对象是不可变的,如果可能的话,我希望保持这种状态。我已经编写了我的nullSafeGet,从ResultSet中提取坐标并调用构造函数:@OverridepublicObjectnullSafeGet(ResultSetrs,String[]names,SessionImplementorsession,Objectowner)throwsHibernateException,SQLException{Integereasting=(Intege
我想确保给定的一组对象是不可变的。我在想一些类似的事情:检查是否每个字段都是privatefinal检查类是否是final检查可变成员所以我想我的问题是:3.可能吗?我可以递归地检查一个类的每个成员是否都有它的字段privatefinal,但这还不够,因为一个类可以有一个名为getHaha(param)的方法例如,它将给定的参数添加到数组中。那么有没有一种好的方法来检查一个对象是否是不可变的或者它是否可能?谢谢, 最佳答案 你可能想看看这个项目:MutabilityDetector这个库试图分析特定类的字节码,以发现它是否是不可变的
在检查Java的源代码时BigDecimal类,令我惊讶的是它未声明为最终类:ClassBigDecimalpublicclassBigDecimalextendsNumberimplementsComparableImmutable,arbitrary-precisionsigneddecimalnumbers.(来自OracleDocs)这是否有特定原因,或者开发人员只是忘记添加该关键字?不将不可变类声明为final是一种好习惯吗?BigInteger也是如此,但不适用于String这被宣布为最终的。 最佳答案 引自https:
这个错误是最难追踪的。我不确定发生了什么。我在我的位置机器上运行一个Spark集群。所以整个spark集群都在一个主机下,它是127.0.0.1并且我在独立模式下运行JavaPairRDD>cassandraRowsRDD=javaFunctions(sc).cassandraTable("test","hello").select("rowkey","col1","col2","col3",).spanBy(newFunction(){@Overridepublicbyte[]call(CassandraRowv1){returnv1.getBytes("rowkey").array
我在一些设计书籍中读到,不可变类可以提高可伸缩性,并且尽可能编写不可变类是一种很好的做法。但我认为不可变类增加了对象的增殖。那么,为了提高可伸缩性,使用不可变类好还是使用静态类(所有方法都是静态的类)更好? 最佳答案 immutable的主要好处|然而,classes的优点是您可以公开不可变的内部数据成员,因为调用者无法修改它们。这是一个很大的问题,比如java.util.Date。它是可变的,所以你不能直接从方法中返回它。这意味着你最终会做各种defensivecopying.这会增加对象增殖。另一个主要好处是不可变对象(immu