我搜索了该主题,但是除了Wikipedia之外,我没有找到其他有用的文档或文章。
有人可以用简单的词向我解释这意味着什么,还是可以将我引向一些简单易懂的文档?
我搜索了该主题,但是除了Wikipedia之外,我没有找到其他有用的文档或文章。
有人可以用简单的词向我解释这意味着什么,还是可以将我引向一些简单易懂的文档?
Answers:
对于Java而言,这并不意味着什么。
类不变式只是一个属性,它始终为一个类的所有实例保存,无论其他代码做什么。
例如,
class X {
final Y y = new Y();
}
X具有不变的类,即存在一个y
属性,并且永远不存在,null
并且它具有type值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++;
}
}
但无法保留不变的要求count
始终正常成功的调用(缺少TCB违规†),因为count
如果死锁的线程拥有计数器的监视器,则可能会引发异常或阻塞。
每种带有类的语言都易于维护某些类不变式,而不能维护其他不变式。Java也不例外:
private
字段,因此依赖私有数据的不变量易于维护。null
值以多种方式潜行,因此很难维护“具有真实值”的不变式。†- 外部性或TCB违反是系统设计者乐观地认为不会发生的事件。
通常,我们只相信基本硬件能够像在其上构建的高级语言的属性那样进行宣传,而我们不变式的论点并未考虑以下可能性:
setAccessible
来修改private
查找表。对于某些系统,我们的TCB可能仅包括系统的一部分,因此我们可能不会假定
但是我们可以假设
系统级别越高,通常其TCB越大,但是从TCB中获得的不可靠信息越多,不变量保持的可能性就越大,从长远来看,系统越可靠。
count
永远不会两次返回相同的值”真的被视为类不变式吗?
不变是指无论发生什么变化或使用或转换的人,都应该坚持其条件的事物。也就是说,即使使用公共方法进行了转换,类的属性也始终满足或满足某些条件。因此,可以确保此类的客户端或用户有关该类及其属性。
例如,
关于实例类,这些事实必须是正确的。例如,如果一个类具有属性X,并且不变量可以为X则必须大于0。就我所知,没有用于维护不变量的内置方法,您必须将属性设为私有,并确保您的getter和setter强制执行invariance属性。
有可用的注释,可以使用反射和拦截器检查属性。 http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html