不可变JDK类的完整列表?

时间:2011-05-13 21:36:09

标签: immutability java

jdk中是否有事实上不可变类的列表?

技术上不可变类包括明显的Integer,Double等..

事实上,不可变的将包括例如java.lang.String - 它在技术上可能是可变的,但实际上它不是。

此外,是否需要接口/抽象类(如javadoc中所述)是不可变的?

如果你不能提供一个完整的List,如果你知道一堆在javadoc中声明不变性的类,我会很高兴。

2 个答案:

答案 0 :(得分:5)

您可以使用MutabilityDetector并从JDK中提取JAR以枚举大多数不可变类。它是“最”的,因为它是如此严格,即使tiny bit of state change in java.lang.String足以使其被认为是可变的,但目标是通过1.0版本来解释这一点。

您可以在此处下载最新的JAR:https://github.com/MutabilityDetector/MutabilityDetector/releases

这是一个使用它的例子。这就是我以前在OSX上获得大多数不可变的JDK 1.7类的原因:

java -jar MutabilityDetector-0.9.5.jar -r IMMUTABLE -cp /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/rt.jar

这是输出(略微清理): https://gist.github.com/CalebFenton/85fc87edf64033afe110

我需要为Android框架类执行此操作。棘手的部分是找到一个带有Android类的JAR,而不仅仅是包含在SDK中的存根。 Robolectric的优秀人才会制作一个,您可以在此处下载:http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22android-all%22

您可以看到我使用的不可变Android类列表,其中包含许多JDK类: https://github.com/CalebFenton/simplify/blob/master/smalivm/src/main/resources/immutable_classes.cfg

答案 1 :(得分:-6)

无法修改其对象内容的类称为不可变类。所有原始数据类型(仅限Wrapper类)都是不可变的。对于任何不可变的类,需要进行以下操作。

  • 将所有字段设为私有
  • 不提供mutators
  • 确保无法通过创建类来覆盖方法 最终(强不可变性)或使你的方法最终(弱) 不变性)
  • 如果字段不是原始字段或不可变字段,请在路上进行深度克隆 in and the way out。

谢谢