草庐IT

Immutability

全部标签

java - Java 会优化不可变对象(immutable对象)吗?

Java字符串是不可变的,用相同的值实例化多个字符串返回相同的对象指针。(对此有一个术语吗?“池化”似乎很合适,但这已经指的是进行缓存以通过减少实例化来节省时间。)Java是否也对其他不可变的(用户定义的)类执行此操作(没有术语)?Java甚至可以检测到一个类是不可变的,或者这是字符串类所独有的东西? 最佳答案 写信。字符串,你要找的词是interning.Java不会为您自己的不可变对象(immutable对象)执行此操作。不过,它确实有盒装原语的缓存版本。请参阅wrapperclasscaching上的这篇文章了解更多信息。

java - 这是不可变类和构建器模式的有效 Java 实现吗?

Builder实现了Cloneable并覆盖了clone()并且不复制构建器的每个字段,不可变类保留了构建器的私有(private)克隆。这使得返回新构建器和创建不可变实例的稍微修改的副本变得容易。我可以这样走MyImmutablei1=newMyImmutable.Builder().foo(1).bar(2).build();MyImmutablei2=i1.builder().foo(3).build();据说Cloneable接口(interface)有些损坏,但这是否违反了良好的Java编码实践,这种构造是否存在任何问题?finalclassMyImmutable{publi

java - 对象不变性的单元测试

我想确保给定的一组对象是不可变的。我在想一些类似的事情:检查是否每个字段都是privatefinal检查类是否是final检查可变成员所以我想我的问题是:3.可能吗?我可以递归地检查一个类的每个成员是否都有它的字段privatefinal,但这还不够,因为一个类可以有一个名为getHaha(param)的方法例如,它将给定的参数添加到数组中。那么有没有一种好的方法来检查一个对象是否是不可变的或者它是否可能?谢谢, 最佳答案 你可能想看看这个项目:MutabilityDetector这个库试图分析特定类的字节码,以发现它是否是不可变的

java - 为什么 Java 的 BigDecimal 类没有声明为 final?

在检查Java的源代码时BigDecimal类,令我惊讶的是它未声明为最终类:ClassBigDecimalpublicclassBigDecimalextendsNumberimplementsComparableImmutable,arbitrary-precisionsigneddecimalnumbers.(来自OracleDocs)这是否有特定原因,或者开发人员只是忘记添加该关键字?不将不可变类声明为final是一种好习惯吗?BigInteger也是如此,但不适用于String这被宣布为最终的。 最佳答案 引自https:

java - 可变类还是不可变类?

我在一些设计书籍中读到,不可变类可以提高可伸缩性,并且尽可能编写不可变类是一种很好的做法。但我认为不可变类增加了对象的增殖。那么,为了提高可伸缩性,使用不可变类好还是使用静态类(所有方法都是静态的类)更好? 最佳答案 immutable的主要好处|然而,classes的优点是您可以公开不可变的内部数据成员,因为调用者无法修改它们。这是一个很大的问题,比如java.util.Date。它是可变的,所以你不能直接从方法中返回它。这意味着你最终会做各种defensivecopying.这会增加对象增殖。另一个主要好处是不可变对象(immu

java - 我们如何使用可变引用来保持类的不可变性

我知道使我们的类不可变的所有基本规则,但是当有另一个类引用时我有点困惑。我知道是否有集合而不是Address那么我们可以利用Collections.unmodifiableList(newArrayList(modifiable));然后我们可以让我们的类不可变。但在下面的情况下,我仍然无法理解这个概念。publicfinalclassEmployee{privatefinalintid;privateAddressaddress;publicEmployee(intid,Addressaddress){this.id=id;this.address=address;}publicin

java - 为什么要使 private static final Lists/Sets/Maps 不可修改?

我刚刚阅读了一位更有经验的程序员编写的一些代码,我遇到了以下问题:publicclassConsoleFormatterextendsFormatter{privatestaticfinalMapPREFIXES;static{Mapprefixes=newHashMap();prefixes.put(Level.CONFIG,"[config]");prefixes.put(Level.FINE,"[debug]");prefixes.put(Level.FINER,"[debug]");prefixes.put(Level.FINEST,"[trace]");prefixes.pu

java - Java 中小型不可变对象(immutable对象)的缓存策略?

我正在开发一个应用程序,它可以创建大量不可变的小Java对象。一个例子可能是:publicclassPoint{finalintx;finalinty;finalintz;.....}许多Point实例可能需要引用相同的(x,y,z)位置。在应用程序的生命周期中尝试缓存和重用此类对象在多大程度上有意义?有什么特殊的技巧来处理这种情况? 最佳答案 当它成为一个问题时。否则,您只是在创建无用的抽象层。无论哪种方式,您都可以使用PointFactory轻松实现这一点,调用它来获取Point,对于任何给定的x、y和z。但是你必须管理何时应该

java - 有效不可变对象(immutable对象)

我想确保我根据Java内存模型正确理解了“有效不可变对象(immutable对象)”的行为。假设我们有一个可变类,我们希望将其发布为有效的不可变类:classOutworld{//ThisMAYbeaccessedbymultiplethreadspublicstaticvolatileMutableLongpublished;}//ThisclassismutableclassMutableLong{privatelongvalue;publicMutableLong(longvalue){this.value=value;}publicvoidincrement(){value++

java不可变类慢得多

我需要一些Complex数学库,所以我在使用不可变Complex的库和使用可变Complex的库之间犹豫不决。显然,我希望计算运行得相当快(除非它会破坏可读性等)。所以我创建了可变速度与不可变速度的简单测试:finalclassMutableInt{privateintvalue;publicintgetValue(){returnvalue;}publicvoidsetValue(intvalue){this.value=value;}publicMutableInt(){this(0);}publicMutableInt(intvalue){this.value=value;}}f