Полный список неизменяемых классов JDK?
есть список де-факто неизменяемые классы в jdk?
технически неизменяемые классы включают очевидное целое число, Double и т. д..
де-факто неизменяемый будет включать, например, java.ленг.String-это может быть технически изменчивым, но де-факто это не так.
кроме того, существуют ли интерфейсы/абстрактные классы, которые требуются (как указано в javadoc), чтобы быть неизменяемыми?
Если вы не можете предоставить полный список, я бы уже будьте счастливы, если вы знаете кучу классов, которые утверждают неизменность в своем javadoc..
3 ответов
классы, содержимое которых не может быть изменено, называются неизменяемыми классами. Все примитивные типы данных(только классы-оболочки) являются неизменяемыми. Для того, чтобы любой класс был неизменяемым, необходимо сделать следующее.
- сделать все поля частные
- не предоставлять мутаторы
- убедитесь, что методы не могут быть переопределены или класс окончательный (сильная неизменность) или сделать ваши методы окончательными (слабый Неизменность)
- Если поле не примитивный или неизменный, сделайте глубокий клон на пути вход и выход.
спасибо
Я пытаюсь скомпилировать список как можно больше:
- java.ленг.Строка Классы-оболочки для примитивных типов:
- java.ленг.Целое число
- java.ленг.Байт
- java.ленг.Характер
- java.ленг.Short
- java.ленг.Boolean
- java.ленг.Долго
- java.ленг.Двойной
- java.ленг.Float
- java.ленг.StackTraceElement (используется в исключении здания стеков)
- большинство классов enum
- java.математика.Типа BigInteger
- java.математика.У bigdecimal
- java.Ио.Файл
- java.ОУ.Шрифт
- java.ОУ.BasicStroke
- java.ОУ.Цвет
- java.ОУ.GradientPaint,
- java.ОУ.LinearGradientPaint
- java.ОУ.RadialGradientPaint,
- java.ОУ.Курсор
- java.утиль.Локаль
- java.утиль.идентификатор UUID
- java.утиль.Сборники
- Ява.чистая.URL-адрес
- java.сеть.Ури
- java.сеть.Inet4Address
- java.сеть.Inet6Address
- java.сеть.InetSocketAddress
- большинство подклассов 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