Полный список неизменяемых классов JDK?

есть список де-факто неизменяемые классы в jdk?

технически неизменяемые классы включают очевидное целое число, Double и т. д..

де-факто неизменяемый будет включать, например, java.ленг.String-это может быть технически изменчивым, но де-факто это не так.

кроме того, существуют ли интерфейсы/абстрактные классы, которые требуются (как указано в javadoc), чтобы быть неизменяемыми?

Если вы не можете предоставить полный список, я бы уже будьте счастливы, если вы знаете кучу классов, которые утверждают неизменность в своем javadoc..

3 ответов


классы, содержимое которых не может быть изменено, называются неизменяемыми классами. Все примитивные типы данных(только классы-оболочки) являются неизменяемыми. Для того, чтобы любой класс был неизменяемым, необходимо сделать следующее.

  • сделать все поля частные
  • не предоставлять мутаторы
  • убедитесь, что методы не могут быть переопределены или класс окончательный (сильная неизменность) или сделать ваши методы окончательными (слабый Неизменность)
  • Если поле не примитивный или неизменный, сделайте глубокий клон на пути вход и выход.

спасибо


Я пытаюсь скомпилировать список как можно больше:

  1. java.ленг.Строка Классы-оболочки для примитивных типов:
  2. java.ленг.Целое число
  3. java.ленг.Байт
  4. java.ленг.Характер
  5. java.ленг.Short
  6. java.ленг.Boolean
  7. java.ленг.Долго
  8. java.ленг.Двойной
  9. java.ленг.Float
  10. java.ленг.StackTraceElement (используется в исключении здания стеков)
  11. большинство классов enum
  12. java.математика.Типа BigInteger
  13. java.математика.У bigdecimal
  14. java.Ио.Файл
  15. java.ОУ.Шрифт
  16. java.ОУ.BasicStroke
  17. java.ОУ.Цвет
  18. java.ОУ.GradientPaint,
  19. java.ОУ.LinearGradientPaint
  20. java.ОУ.RadialGradientPaint,
  21. java.ОУ.Курсор
  22. java.утиль.Локаль
  23. java.утиль.идентификатор UUID
  24. java.утиль.Сборники
  25. Ява.чистая.URL-адрес
  26. java.сеть.Ури
  27. java.сеть.Inet4Address
  28. java.сеть.Inet6Address
  29. java.сеть.InetSocketAddress
  30. большинство подклассов java.безопасность.Разрешите!--4-->

можно использовать MutabilityDetector и кормить его банками из JDK для перечисления большинства неизменяемых классов. Это "большинство", потому что это так строго, что даже крошечный бит изменения состояния в java.ленг.Строка достаточно, чтобы сделать его изменяемым, но цель состоит в том, чтобы учесть это в выпуске 1.0.

вы можете скачать последнюю банку здесь:https://github.com/MutabilityDetector/MutabilityDetector/releases

вот пример это польза. Это то, что я использовал, чтобы получить большинство неизменяемых классов JDK 1.7 на OSX:

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 framework. Сложной частью было найти банку с классами Android, а не только заглушки, которые включены в 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