Полный список неизменяемых классов JDK? - PullRequest
7 голосов
/ 14 мая 2011

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

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

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

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

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

Ответы [ 3 ]

18 голосов
/ 02 мая 2015

Я стараюсь составить список настолько, насколько смогу:

  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. Mostклассов enum
  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
5 голосов
/ 12 мая 2015

Вы можете использовать MutabilityDetector и передать его JAR-файлы из JDK для перечисления большинства неизменяемых классов.Это «большинство», потому что оно настолько строго, что даже крошечного изменения состояния в java.lang.String достаточно, чтобы считать его изменчивым, но цель состоит в том, чтобы учесть это в версии 1.0.

Вы можете скачать последнюю версию JAR здесь: 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.Сложнее было найти JAR с классами 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

0 голосов
/ 04 ноября 2011

Классы, содержимое объекта которых не может быть изменено, называются неизменяемыми классами. Все примитивные типы данных (только классы Wrapper) являются неизменяемыми. Чтобы любой класс был неизменным, необходимо сделать следующее.

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

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...