Некоторые известные неизменяемые классы в Стандартном API:
- java.lang.String (уже упоминалось)
- Классы-оболочки для примитивных типов: java.lang.Integer,java.lang.Byte, java.lang.Character, java.lang.Short, java.lang.Boolean, java.lang.Long, java.lang.Double, java.lang.Float
- java.lang.StackTraceElement (используется при построении трассировки стека исключений)
Большинство перечисляемых классов являются неизменяемыми, но на самом деле это зависит от конкретного случая.(Не реализуйте изменяемые перечисления, это может вас испортить.) Я думаю, что по крайней мере все перечисляемые классы в стандартном API на самом деле неизменны.
java.math.BigIntegerи java.math.BigDecimal (по крайней мере, сами объекты этих классов, подклассы могут вводить изменчивость, хотя это не очень хорошая идея)
java.io.File.Обратите внимание, что это представляет собой внешний по отношению к ВМ объект (файл в локальной системе), который может существовать или не существовать, и имеет некоторые методы, изменяющие и запрашивающие состояние этого внешнего объекта.Но сам объект File остается неизменным.(Все остальные классы в java.io являются изменяемыми.)
java.awt.Font - представляет шрифт для рисования текста на экране (могут быть некоторые изменяемые подклассы, но это будетконечно, бесполезно)
- java.awt.BasicStroke - вспомогательный объект для рисования линий в графическом контексте
- java.awt.Color - (по крайней мере, объекты этого класса, некоторыеподклассы могут быть изменяемыми или зависеть от некоторых внешних факторов (например, системных цветов), а также от большинства других реализаций java.awt.Paint, таких как
- java.awt.GradientPaint,
- java.awt.LinearGradientPaint
- java.awt.RadialGradientPaint,
- (я не уверен насчет java.awt.TexturePaint)
java.awt.Cursor - представление растрового изображения для курсора мыши (здесь также некоторые подклассы могут быть изменяемыми или зависеть от внешних факторов)
java.util.Locale - представлять определенный географический, политический или культурный регион .
- java.util.UUID - максимально глобальный уникальный идентификатор
, хотя большинство коллекций являются изменяемыми, в классе java.util.Collections есть некоторые методы-оболочки, которые возвращают неизменяемое представлениена коллекции.Если вы передадите им коллекцию, не известную нигде, это на самом деле неизменные коллекции.Кроме того, Collections.singletonMap()
, .singletonList
, .singleton
возвращают неизменяемые одноэлементные коллекции, а также есть неизменяемые пустые.
java.net.URL и java.net.URI - представляет ресурс (в Интернете или где-то еще)
- java.net.Inet4Address и java.net.Inet6Address, java.net.InetSocketAddress
- большинство подклассов Java.security.Permission (представляющий разрешения, необходимые для какого-либо действия или предоставленные некоторому коду), но не java.security.PermissionCollection и подклассы.
- Все классы
java.time
, за исключением DateTimeException
, являются неизменяемыми.Большинство классов подпакетов java.time
тоже неизменны.
Можно сказать, что примитивные типы тоже неизменны - вы не можете изменить значение 42, не так ли?
является классом AccessControlContext неизменным классом
AccessControlContext не имеет никаких методов мутации.И его состояние состоит из списка ProtectionDomains (который является неизменным классом) и DomainCombiner.DomainCombiner является интерфейсом, так что в принципе реализация может сделать что-то другое при каждом вызове
1081 * В самом деле, а также поведение ProtectionDomain может зависеть от текущей политики в силе. - спорно ли называть такиенеизменяемый объект.
и AccessController?
Нет объектов типа AccessController, так как это последний класс без доступного конструктора. Все методы являются статическими. Можно сказать, что AccessController не является ни изменяемым, ни неизменным, ни то и другое.
То же самое верно для всех других классов, которые не могут иметь объекты (экземпляры), наиболее известные:
- java.lang.Void
- java.lang.System (но у этого есть некоторое изменяемое статическое состояние -
in
, out
, err
)
- java.lang.Math (это тоже - генератор случайных чисел)
- java.lang.reflect.Array
- java.util.Collections
- java.util.Arrays