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