Java中的类不变量是什么?
2022-08-31 10:14:04
我用谷歌搜索了这个话题,但除了维基百科,我没有找到任何进一步的有用文档或文章。
任何人都可以用简单的语言向我解释它的含义,或者向我推荐一些漂亮且易于理解的文档吗?
我用谷歌搜索了这个话题,但除了维基百科,我没有找到任何进一步的有用文档或文章。
任何人都可以用简单的语言向我解释它的含义,或者向我推荐一些漂亮且易于理解的文档吗?
在Java中,它没有任何特别的含义。
类不变量只是一个属性,它始终对类的所有实例都有效,无论其他代码如何操作。
例如
class X {
final Y y = new Y();
}
X 具有类不变性,即存在一个属性,并且它从不,并且它具有类型 。y
null
Y
class Counter {
private int x;
public int count() { return x++; }
}
这未能维护两个重要的不变量:
count
count
修改后的类保留这两个不变量。
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
...但无法保留调用始终正常运行的不变量(不存在 TCB 违规†),因为如果死锁线程拥有计数器的监视器,则可能会引发异常或阻塞。count
count
每门带有类的语言都可以轻松维护某些类不变量,但不能维护其他类不变量。Java也不例外:
private
null
† - 外部性或TCB违规是系统设计人员乐观地认为不会发生的事件。
通常,我们只是相信基本硬件在谈论基于它们构建的高级语言的属性时所宣传的那样工作,并且我们的不变量持有的论点没有考虑到以下可能性:
setAccessible
private
对于某些系统,我们的TCB可能只包括系统的一部分,因此我们可能不会假设
...但我们可以假设:
系统级别越高,其TCB通常越大,但是您可以从TCB中获得的不可靠的东西越多,您的不变量就越有可能成立,从长远来看,您的系统就越可靠。
不变性意味着无论发生什么变化或谁使用它/转换它,都应该坚持其条件。也就是说,类的属性总是满足或满足某些条件,即使在使用公共方法进行转换之后也是如此。因此,可以确保此类的客户端或用户了解该类及其属性。
例如