标准 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
except DateTimeException
是不可变的。子包的大部分类java.time
也是一成不变的。
人们可以说原始类型也是不可变的——你不能改变 42 的值,对吗?
AccessControlContext 类是不可变类吗
AccessControlContext 没有任何变异方法。它的状态由一个 ProtectionDomains 列表(这是一个不可变的类)和一个 DomainCombiner 组成。 DomainCombiner 是一个接口,因此原则上实现可以在每次调用时执行不同的操作。
事实上,ProtectionDomain 的行为也可能取决于当前有效的策略 - 是否称这样的对象为不可变是有争议的。
和访问控制器?
没有 AccessController 类型的对象,因为这是一个最终类,没有可访问的构造函数。所有方法都是静态的。人们可以说 AccessController 既不是可变的也不是不可变的,或者两者兼而有之。
这同样适用于所有其他不能拥有对象(实例)的类,最著名的是:
- java.lang.Void
- java.lang.System(但这有一些可变的静态状态 -
in
, out
, err
)
- java.lang.Math(这也是随机数生成器)
- java.lang.reflect.Array
- java.util.Collections 类
- java.util.Arrays
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)