不可变JDK类的完整列表?

And*_*son 8 java immutability

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

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

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

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

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

kav*_*mre 19

我尝试尽可能多地编译列表:

  1. java.lang.String基元类型的包装类:
  2. 为java.lang.Integer
  3. java.lang.Byte中
  4. java.lang.Character中
  5. java.lang.Short中
  6. java.lang.Boolean的
  7. java.lang.Long中
  8. java.lang.Double中
  9. java.lang.Float中
  10. java.lang.StackTraceElement(用于构建异常堆栈跟踪)
  11. 大多数枚举类
  12. java.math.BigInteger中
  13. java.math.BigDecimal中
  14. 的java.io.File
  15. java.awt.Font中
  16. java.awt.BasicStroke中
  17. java.awt.Color中
  18. java.awt.GradientPaint,
  19. java.awt.LinearGradientPaint
  20. java.awt.RadialGradientPaint,
  21. java.awt.Cursor中
  22. java.util.Locale中
  23. java.util.UUID中
  24. java.util.Collections中
  25. 的java.net.URL
  26. java.net.URI中
  27. java.net.Inet4Address
  28. java.net.Inet6Address
  29. java.net.InetSocketAddress
  30. java.security.Permission的大多数子类


Cal*_*ton 6

您可以使用MutabilityDetector并从JDK中提取JAR以枚举大多数不可变类.它是"最"的,因为它非常严格,即使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