国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

JML起步--使用JML 改進(jìn)你的Java程序(2)

2019-11-18 14:02:49
字體:
供稿:網(wǎng)友

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


量詞(Quantification)(譯者注:這里量詞的意思與邏輯學(xué)上的量詞意思相近,而不是普通意義上理解的量詞。)


在上面pop()方法的行為規(guī)范中,我們說它的返回值要等于peek()方法的返回值,不過我們并沒有看到關(guān)于peek()方法的規(guī)范。PRiorityQueue中peek()方法的行為規(guī)范請看下面的代碼:



代碼段3 PriorityQueue 中peek()方法的行為規(guī)范





/*@

@ public normal_behavior

@ requires ! isEmpty();

@ ensures elementsInQueue.has(esult);

@*/

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



JML標(biāo)記要求只有當(dāng)隊列中至少含有一個元素的時候,才能調(diào)用peek()方法,同時他還要求方法的返回值必須在elementsInQueue之內(nèi),也就是說,這個返回值一定是這個隊列中的一個元素。



注釋/*@ pure @*/ 表明peek()方法是一個純方法(pure method),純方法是指沒有副作用的方法。JML中只答應(yīng)使用純方法進(jìn)行斷言確認(rèn),所以我們把peek()聲明為純方法,這樣我們就可以在pop()方法的后置條件中使用peek()方法。大家肯定想知道,為什么JML只答應(yīng)使用純方法進(jìn)行斷言確認(rèn)?問題是這樣的,假如JML答應(yīng)使用非純方法進(jìn)行斷言確認(rèn)的話,我們稍不注重就會寫出有副作用的行為規(guī)范。比如說可能會有這么一種情況,開啟了斷言確認(rèn)以后,我們的代碼正確無誤,可是假如禁止了斷言確認(rèn)后,我們的代碼卻不能運行了,或運行出錯了。這樣當(dāng)然不行!后面,我們還會進(jìn)一步討論副作用的問題。

關(guān)于繼續(xù)



JML行為規(guī)范可以被子類(含子接口)或者是實現(xiàn)接口的類所繼續(xù),這一點與J2SE1.4中斷言有所不同。JML要害字 also表示當(dāng)前定義的行為規(guī)范與祖先類或被實現(xiàn)的接口中所定義的行為規(guī)范一起作用。因而,在 PriorityQueue接口定義的 peek()方法的行為規(guī)范同樣適用于 BinaryHeap類中的 peek()方法。這個就意味著,雖然在 BinaryHeap.peek()的行為規(guī)范中沒有明確定義, BinaryHeap.peek()的返回值也必須在 elementsInQueue當(dāng)中。




大頂堆和小頂堆(譯者注:大頂堆和小頂堆是數(shù)據(jù)結(jié)構(gòu)里面的概念,分別表示堆排序方法的不同實現(xiàn)方式。堆排序是一種通過調(diào)整二叉樹進(jìn)行排序的方法。)


上面我們給peek()定義的行為規(guī)范明顯缺少了一塊,那就是我們根本沒有要求它返回的那個元素具有最大的優(yōu)先級。顯然,JCCC的PriorityQueue接口既可以用于大頂堆,也可以用于小頂堆。大頂堆和小頂堆的表現(xiàn)是有些差別的,在小頂堆中優(yōu)先級最高的元素值最小,而大頂堆中優(yōu)先級最高的元素值最大。因為PriorityQueue并不知道自己被用來進(jìn)行大頂堆排序還是小頂堆排序,所以指定返回哪個元素的規(guī)范必須在實現(xiàn)PriorityQueue接口的類中進(jìn)行定義。



在JCCC 中,類 BinaryHeap實現(xiàn)了PriorityQueue接口。BinaryHeap答應(yīng)使用它的客戶代碼在構(gòu)造函數(shù)中通過一個參數(shù)來指定排序方案,也就是通過參數(shù)來指定是通過大頂堆方式排序還是通過小頂堆方式排序。我們使用一個boolean模型變量isMinimumHeap來判定BinaryHeap的排序方式是大頂堆還是小頂堆。下面的例子是BinaryHeap使用isMinimumHeap給peek()方法定義的行為規(guī)范:





代碼段4 BinaryHeap 類中peek()方法的行為規(guī)范





/*@

@ also

@ public normal_behavior

@ requires ! isEmpty();

@ ensures

@ (isMinimumHeap ==>

@ (forall Object obj;

@ elementsInQueue.has(obj);

@ compareObjects(esult, obj)

@ <= 0)) &&

@ ((! isMinimumHeap) ==>

@ (forall Object obj;

@ elementsInQueue.has(obj);

@ compareObjects(esult, obj)

@ >= 0));

@*/

public Object peek() throws NoSuchElementException



使用量詞


上面代碼段4中的后置條件包含兩個部分,分別用于大頂堆和小頂堆的情況?!?=>”符號的意思是包含(譯者注:這個包含與邏輯學(xué)中包含的意思一致)。x ==> y 當(dāng)且僅當(dāng)y為真或x為假時取真值。對于小頂堆排序來說,適用下面所列的代碼:



(forall Object obj;

elementsInQueue.has(obj);

compareObjects(

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 和硕县| 金沙县| 沾益县| 甘谷县| 平原县| 宾阳县| 盘锦市| 崇义县| 洪洞县| 山东省| 澄城县| 靖州| 石首市| 恩平市| 望谟县| 来安县| 崇信县| 陇南市| 永济市| 香河县| 皋兰县| 临桂县| 宿松县| 定结县| 松江区| 晋宁县| 乌审旗| 柘城县| 青海省| 花莲县| 卢湾区| 鄂托克前旗| 黄大仙区| 新田县| 错那县| 衡阳市| 霍州市| 江门市| 和静县| 特克斯县| 景谷|