我搜索了该主题,但除了Wikipedia之外,我没有找到任何进一步有用的文档或文章。
任何人都可以用简单的语言向我解释它的含义或者向我推荐一些简单易懂的文档吗?
答案 0 :(得分:77)
对于java来说,这并不意味着什么。
类invariant只是一个属性,它始终保存所有类的实例,无论其他代码是什么。
例如,
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++;
}
}
但未能保留对count
的调用始终正常成功(不存在TCB违规†)的不变量,因为count
可能会引发异常,或者它可能会阻塞死锁线程拥有计数器的监视器。
每个使用类的语言都可以轻松维护某些类不变量而不是其他类。 Java也不例外:
private
字段,因此易于维护依赖私有数据的不变量。null
值以多种方式潜入,因此很难维持“具有真正价值”的不变量。† - 外部性或 TCB违规是系统设计人员乐观地认为不会发生的事件。
通常我们只相信基本硬件在讨论构建在它们上面的高级语言的属性时就像宣传的那样工作,而不变量持有的参数不考虑以下可能性:
setAccessible
的反射来修改private
查找表。对于某些系统,我们的TCB可能只包含系统的一部分,因此我们可能不会假设
但我们可以假设
更高级别的系统,其TCB通常越大,但是从TCB中获得的事物越不可靠,您的不变量就越有可能持有,并且您的系统在更长时间内越可靠运行
答案 1 :(得分:13)
不变意味着无论发生什么变化或使用/转换它的人都应该坚持自己的条件。也就是说,即使在通过使用公共方法进行转换之后,类的属性总是满足或满足某些条件。因此,确保该类及其属性的该类的客户端或用户。
例如,
答案 2 :(得分:9)
它们是关于实例类必须是真实的事实。例如,如果一个类具有属性X且不变,则X必须大于0.据我所知,没有用于维护不变量的内置方法,必须使属性为私有,并确保getter和setter强制执行不变属性。
有一些注释可以使用反射和拦截器检查属性。 http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html