快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

葡京娱乐场真人秀_龟发之家论坛



来自:http://www-106.ibm.com/作者:Joe Verzulli

量词(Quantification)(译者注:这里量词的意思与名学上的量词意思邻近,而不是通俗意义上理解的量词。)

在上面pop()措施的行径规范中,我们说它的返回值要即是peek()措施的返回值,不过我们并没有看到关于peek()措施的规范。PriorityQueue中peek()措施的行径规范请看下面的代码:

代码段3PriorityQueue 中peek()措施的行径规范

/*@

@ public normal_behavior

@requires ! isEmpty();

@ensures elementsInQueue.has(esult);

@*/

/*@ pure @*/ Object peek() throws NoSuchElementException;

JML标记要求只有当行列步队中至少含有一个元素的时刻,才能调用peek()措施,同时他还要求措施的返回值必须在elementsInQueue之内,也便是说,这个返回值必然是这个行列步队中的一个元素。

注释/*@ pure @*/ 注解peek()措施是一个纯措施(pure method),纯措施是指没有副感化的措施。JML中只容许应用纯措施进行断言确认,以是我们把peek()声明为纯措施,这样我们就可以在pop()措施的后置前提中应用peek()措施。大年夜家肯定想知道,为什么JML只容许应用纯措施进行断言确认?问题是这样的,假如JML容许应用非纯措施进行断言确认的话,我们稍不留意就会写出有副感化的行径规范。比如说可能会有这么一种环境,开启了断言确认今后,我们的代码精确无误,可是假如禁止了断言确认后,我们的代码却不能运行了,或运行掉足了。这样当然不可!后面,我们还会进一步评论争论副感化的问题。

关于承袭

JML行径规范可以被子类(含子接口)或者是实现接口的类所承袭,这一点与J2SE1.4中断言有所不合。JML关键字 also表示当前定义的行径规范与先人类或被实现的接口中所定义的行径规范一路感化。因而,在 PriorityQueue接口定义的 peek()措施的行径规范同样适用于 BinaryHeap类中的 peek()措施。这个就意味着,虽然在 BinaryHeap.peek()的行径规范中没有明确定义, BinaryHeap.peek()的返回值也必须在 elementsInQueue傍边。

大年夜顶堆和小顶堆(译者注:大年夜顶堆和小顶堆是数据布局里面的观点,分腕表示堆排序措施的不合实现要领。堆排序是一种经由过程调剂二叉树进行排序的措施。)

上面我们给peek()定义的行径规范显着缺少了一块,那便是我们根本没有要求它返回的那个元素具有最大年夜的优先级。显然,JCCC的PriorityQueue接口既可以用于大年夜顶堆,也可以用于小顶堆。大年夜顶堆和小顶堆的体现是有些差其余,葡京娱乐场真人秀在小顶堆中优先级最高的元素值最小,而大年夜顶堆中优先级最高的元素值最大年夜。由于PriorityQueue并不知道自己被用来进行大年夜顶堆排序照样小顶堆排序,以是指定返回哪个元素的规范必须在实现PriorityQueue接口的类中进行定义。

在JCCC 中,类 BinaryHeap实现了PriorityQueue接口。BinaryHeap容许应用它的客户代码在构造函数中经由过程一个参数来指定排序规划,也便是经由过程参数来指定是经由过程大年夜顶堆要领排序照样经由过程小顶堆要领排序。我们应用一个boolean模型变量isMinimu葡京娱乐场真人秀mHeap来判断BinaryHeap的排序要领是大年夜顶堆照样小顶堆。下面的例子是BinaryHeap应用isMinimumHeap给peek()措施定义的行径规范:

代码段4BinaryHeap 类中peek()措施的行径规范

/*@

@ also

@public normal_behavior

@requires ! isEmpty();

@ensur葡京娱乐场真人秀es

@(isMinimumHeap ==>

@(forall Object obj;

@elementsIn葡京娱乐场真人秀Queue.has(obj);

@compareObjects(esult, obj)

@

@(forall Object obj;

@elementsInQueue.has(obj);

@compareObjects(esult, obj)

@>= 0));

@*/

public Object peek() throws NoSuchElementException

应用量词

上面代码段4中的后置前提包孕两个部分,分手用于大年夜顶堆和小顶堆的环境。“==>”符号的意思是包孕(译者注:这个包孕与名学中包孕的意思同等)。x ==> y 当且仅当y为真或x为假时取真值。对付小顶堆排序来说,适用下面所列的代码:

(forall Object obj;

elementsInQueue.has(obj);

compareObjects(esult, obj)

@(esult == ((Comparable) a).compareTo(b)) &&

@(comparator != null) ==>

@(esult == comparator.compare(a, b));

@

@ public pure model int compareObjects(Object a, Object b)

@ {

@ if (m_comparator == null)

@return ((Comparable) a).compareTo(b);

@ else

@return m_comparator.compare(a, b);

@ }

@*/

compareObjects措施的定义中葡京娱乐场真人秀应用了别的一个关键字model,它的意思是compareObjects措施是一个模型措施。模型措施是只能用在行径规范中的JML措施。模型措施定义在Java的注释中,以是老例的Java代码不能应用。

假如BinaryHeap类的客户代码指定了一个特殊的Comparator用来进行对照的话,m_comparator就指向那个Comparator,否则m_comparator的值便是null。compareObjects()措施反省m_comparator的值,然后采纳适当的措施进行元素间的对照。

模型域若何取值

在代码段4中我们评论争论了peek()措施的后置前提。这个前提包管peek()措施的返回值的优先级大年夜于或者即是模型域elementsInQueue中所有的元素的优先级。那么有一个问题,像elementsInQueue这样的模型域若何取值?前置前提、后置前提和不变量都是没有副感化的,以是不能应用它们来设置模型域的值。

JML应用一个represents语句把模型域与详细的实现域关联起来。比如下面的represents语句用来给模型域isMinimumHeap赋值:

//@ private represents isMinimumHeap <- m_isMinHeap;

这个语句的意思是模型域isMinimumHeap的值即是m_isMinHeap的值,此中,m_isMinHeap是BinaryHeap类中一个私有的布尔变量。 一旦必要用到isMinimumHeap的值,JML就会把m_isMinHeap的值赋给它。

represents语句并没有限定<-右边必须是成员变量。比如说,下面是elementsInQueue的represents语句:

代码段6elementsInQueue 的represents语句

/*@ private represents elementsInQueue

@<- JMLObjectBag.convertFrom(

@Arrays.asList(m_elements)

@.subList(1, m_size + 1));

@*/

从这里我们可以看出,elementsInQueue的元素便是数组m_elements[]从第一个元素到第m_size个元素共m_size个元素构成的列表,此中数组m_elements[]是BinaryHeap的一个私有成员,用来存储优先级行列步队中的元素,m_size是m_elements[]中正在应用的元素的个数。类BinaryHeap没有应用m_elements[0],这样可以简化对付索引的操作。JMLObjectBag.convertFrom()的感化是把一个List布局转化为一个elementsInQueue所必要的JMLObjectBag布局。这样一旦JML运行时进行断言反省的时刻必要elementsInQueue的值,系统就管帐算represents 语句<-符号右边的代码并进行求值。

下面我们来看一下副感化和非常行径。

您可能还会对下面的文章感兴趣: