日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:182日期:2024-06-28 16:04:21
內(nèi)容: 來自:http://www-106.ibm.com/ 作者:Joe Verzulli Java建模語言(Java Modeling Language,JML)是一種進(jìn)行詳細(xì)設(shè)計的符號語言,他鼓勵你用一種全新的方式來看待Java的類和方法。本教程中,Java程序設(shè)計資深顧問Joe Verzulli 將會給大家介紹這一新的工具以及如何使用這個工具。 面向?qū)ο蟮姆治龊驮O(shè)計(OOAD)的一個重要原則就是過程性的思考應(yīng)該盡可能地推遲,不過遵循這個原則的大多數(shù)人也不過是把這個原則適用到方法實(shí)現(xiàn)這個級別上。一旦設(shè)計好了類和接口,下面的事情自然就是實(shí)現(xiàn)其中定義的方法了。對呀,我們還能做什么呢?還有什么其它方法可以使用嗎?畢竟,用Java進(jìn)行程序設(shè)計和用其他語言進(jìn)行程序設(shè)計一樣,我們都要一步一步地實(shí)現(xiàn)每一個方法。 標(biāo)記本身只是表示如何做一個事情(how to do something),根本不管我們希望做什么。如果我們在做一個事情之前就能夠知道我們能夠達(dá)到什么樣的結(jié)果是非常好的,不過Java語言并沒有給我們提供一個可以顯示地把這些信息插入到我們程序代碼的方法。 Java建模語言(Java Modeling Language,JML)在Java代碼中增加了一些符號,這些符號用來標(biāo)識一個方法是干什么的,卻并不關(guān)心它的實(shí)現(xiàn)。如果使用JML的話,我們就能夠描述一個方法的預(yù)期的功能而不管他如何實(shí)現(xiàn)。通過這種方式,JML把過程性的思考延遲到方法設(shè)計中,從而擴(kuò)展了面向?qū)ο笤O(shè)計的這個原則。 JML引入了大量用于描述行為的結(jié)構(gòu),比如有模型域、量詞、斷言可視范圍、預(yù)處理、后處理、條件繼承以及正常行為(與異常行為相對)規(guī)范等等。這些結(jié)構(gòu)使得JML非常強(qiáng)大,不過你并不必要理解或者使用上面所述的所有方面,也不需要一次使用所有的這些方面。你可以一點(diǎn)一點(diǎn)的學(xué)習(xí),從非常簡單的開始。 這篇文章中采用循序漸進(jìn)的方式來介紹JML。我們要先了解一下使用JML的各種好處,特別是對開發(fā)和編譯過程的影響。然后,我們要討論一下JML的一些結(jié)構(gòu),比如前置條件、后置條件、模型域、量詞、副作用以及異常行為等等。同時,在討論這些結(jié)構(gòu)的同時,我們會給出一些例程來給你一個直觀的感覺。這樣經(jīng)過本文的學(xué)習(xí),你將可以對JML是如何工作的有一個概念性的理解,從而能夠在你自己的項目中應(yīng)用JML。 JML概覽使用JML來聲明性地描述一個方法或類的預(yù)期行為可以顯著提高整體的開發(fā)進(jìn)程。把建模標(biāo)記加入到你的Java程序代碼中有以下好處:能夠更為精確地描述這些代碼是做什么的 能夠高效地發(fā)現(xiàn)和修正程序中的bug 可以在應(yīng)用程序升級時降低引入bug的機(jī)會 可以提早發(fā)現(xiàn)客戶代碼對類的錯誤使用 可以提供與應(yīng)用程序代碼完全一致的JML格式的文檔 JML標(biāo)記總是在Java注釋的內(nèi)部,所以對正常編譯的代碼沒有任何影響。如果你想比較一下普通的類和使用了JML的類有什么差別的話,你可以使用一個開源的JML編譯器(請參考 如下地址)。用JML編譯器編譯的代碼如果沒有實(shí)現(xiàn)JML規(guī)范所要求的事項,運(yùn)行時就會拋出一個JML異常。這個特性不僅可以幫助我們捕獲代碼中的bug,而且可以確保JML形式的文檔可以與程序代碼高度一致。 文章下面的部分,我將使用開放源代碼的Jakarta Commons Collection Component (JCCC)項目中的PriorityQueue接口和BinaryHeap 類來演示JML的各種性質(zhì)。在這里你可以找到使用了JML標(biāo)記完整的這個兩個文件。 要求和責(zé)任本文中使用的代碼(請參考 如下地址)包括開源項目JCCC中的PriorityQueue 接口。接口嘛,自然是聲明了一些方法的簽名,包括方法的參數(shù)類型、返回值的類型,并不涉及方法的實(shí)現(xiàn)。一般情況下或者只是按照J(rèn)ava語法要求的話,實(shí)現(xiàn)接口的類只要實(shí)現(xiàn)了接口中定義的各個方法即可,不論實(shí)現(xiàn)的方式是多么地離奇古怪。我們并不想這樣,我們希望能夠確定一個行為規(guī)范,所有實(shí)現(xiàn)這個接口的類都用我們指定的方式來實(shí)現(xiàn)這個接口中定義的方法。通過使用JML我們可以做到這一點(diǎn)。 考慮一下PriorityQueue接口的pop()方法,對于優(yōu)先級隊列來說,pop()方法應(yīng)該有什么樣的功能要求?最起碼應(yīng)該有三個:第一,如果要調(diào)用pop()方法,隊列中至少要有一個元素;第二,該方法應(yīng)該返回隊列中優(yōu)先級最高的那個元素;第三,該方法應(yīng)該從隊列中刪除返回的那個元素。 下面代碼段顯示了表示滿足第一個要求的JML標(biāo)記: 代碼段1 pop()方法功能規(guī)范的JML標(biāo)記 /*@ @ public normal_behavior @ requires ! isEmpty(); @*/Object pop() throws NoSuchElementException; 前面已經(jīng)提到,JML標(biāo)記是寫在Java代碼的注釋中的。包含JML標(biāo)記的多行注釋以/*@ 開頭,JML忽略任何以@開頭的空行。如果是單行的話,你也可以使用//@這種標(biāo)記。這里JML注釋中public關(guān)鍵字與Java中的public意思是一樣的,它表示程序中其他所有的類都要遵循這個JML要求。Public要求只能應(yīng)用在public方法和public成員變量上。JML同樣有private-、 protected-、 以及 package-級別的作用域。同樣,這些作用域的規(guī)則與Java語言中作用域的規(guī)則非常相似。 這里normal_behavior關(guān)鍵字的意思是,這個JML要求表示這是一種正常情況,運(yùn)行時不會拋出異常。后面,我們會描述異常行為是怎么被界定的。 前置條件和后置條件JML關(guān)鍵字requires用來表示前置條件,前置條件表示調(diào)用一個方法前必須滿足的一些要求。上面代碼段中包含一個前置條件,它要求調(diào)用pop()方法的前提就是isEmpty()方法返回false,也就是說要求這個隊列至少含有一個元素。 一個方法的后置條件規(guī)范表示一個方法的責(zé)任,也就是說當(dāng)這個方法返回時,它必須滿足這個后置條件的要求。在我們上面的例子中,pop()方法應(yīng)該返回隊列中優(yōu)先級最高的元素。我們希望指定一個后置條件要求JML在運(yùn)行時檢查是否滿足這個事實(shí)。要做到這一點(diǎn),我們必須跟蹤所有添加到這個優(yōu)先級隊列中的元素,這樣我們就可以判斷pop()方法應(yīng)該返回哪一個元素。怎么做呢?你可能會考慮在PriorityQueue接口中加入一個成員變量來存儲隊列中元素的值,不過這樣做有兩個問題:PriorityQueue是一個接口,它可能有各種不同具體的實(shí)現(xiàn)方式,比如說binary heap、Fibonacci heap或者calendar queue等等,它要與它的各種實(shí)現(xiàn)一致,況且JML標(biāo)記不應(yīng)該涉及到任何具體的實(shí)現(xiàn)細(xì)節(jié)。 作為一個接口,PriorityQueue只能擁有靜態(tài)成員變量。 為了處理這種情況,JML引入了一個叫做模型域(model fields)的概念。 模型域模型域類似于成員變量,它只能被應(yīng)用到行為規(guī)范中。這是一個PriorityQueue中聲明模型域的例子: //@ public model instance JMLObjectBag elementsInQueue; 這個聲明的意思是說這里有一個叫做elementsInQueue的模型域,它的類型是JMLObjectBag (這個數(shù)據(jù)類型是在JML中定義的)。instance關(guān)鍵字表示雖然這個域是定義在接口中,可是任何實(shí)現(xiàn)這個接口的類都擁有一個單獨(dú)的、非靜態(tài)的elementsInQueue域。與其他JML標(biāo)記一樣,這個聲明也是出現(xiàn)在注釋中的,所以常規(guī)的Java代碼是不能使用這個elementsInQueue變量的。在程序運(yùn)行的時候,是沒有任何對象擁有一個叫做elementsInQueue的成員變量的。 行為規(guī)范與實(shí)現(xiàn) 使用一個包來存儲隊列中的元素,然后檢查每一個元素找出優(yōu)先級最高的那一個會讓人覺得效率不高。不過這只是行為規(guī)范的一部分,而不會涉及到實(shí)現(xiàn)。行為規(guī)范的作用在于描述 PriorityQueue的行為接口,也就是說規(guī)定了使用 PriorityQueue的客戶代碼所能依賴的外部行為。 PriorityQueue接口的各個具體實(shí)現(xiàn)只要可以滿足這個行為規(guī)范的要求,就可以使用任何更為高效的方法。比如說,JCCC有一個實(shí)現(xiàn)這個接口的 BinaryHeap類,它的實(shí)現(xiàn)方式就是使用一個存儲在數(shù)組中的 binary heap 。 不過雖然用JML定義行為規(guī)范的時候不需要考慮執(zhí)行效率,程序運(yùn)行時JML斷言檢查卻是很重要的。所以開啟斷言檢查時程序的運(yùn)行可能會有性能的壓力。 elementsInQueue 存儲添加到優(yōu)先級隊列的元素的值,下面的代碼段顯示pop()方法如何使用elementsInQueue: 代碼段2 在pop()的后置條件中使用模型域 /*@ @ public normal_behavior @ requires ! isEmpty(); @ ensures @ elementsInQueue.equals(((JMLObjectBag) @ old(elementsInQueue)) @ .remove(result)) && @ result.equals(old(peek())); @*/Object pop() throws NoSuchElementException; ensures關(guān)鍵字表示后面跟著的是pop()方法返回時必須滿足的后置條件。result是一個JML關(guān)鍵字,它等于pop()方法的返回值。old()是一個JML函數(shù),它返回pop()方法調(diào)用之前參數(shù)的值。 這個ensures語句包含了兩個后置條件。第一,pop()方法返回的那個元素必須要從elementsInQueue刪除。第二,這個返回值要與peek()方法返回的值一致。 類級別的不變量我們現(xiàn)在已經(jīng)看到JML能夠讓我們規(guī)定方法的前置條件和后置條件,它同樣也允許我們指定類級別的不變量。類級別的不變量指的是進(jìn)入和退出一個類中每個方法都必須滿足的條件。比方說吧,//@ public instance invariant elementsInQueue != null; 就是PriorityQueue的一個不變量,它的意思是任何實(shí)現(xiàn)PriorityQueue的類一旦被實(shí)例化,elementsInQueue的值就不能是null。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久亚州av| 97久久中文字幕| 成人污污视频| 国产精品一区2区3区| 日韩国产91| 国产精品自拍区| 五月天久久久| 蜜臀av性久久久久蜜臀aⅴ流畅| 你懂的国产精品永久在线| аⅴ资源天堂资源库在线| 久久精品一区二区国产| 日韩和欧美一区二区三区| 久久精品一本| 国产自产自拍视频在线观看| 国产传媒av在线| 久久久久久黄| 不卡在线一区二区| 久久最新视频| 亚洲精品影视| 国产精品对白久久久久粗| 日韩午夜av在线| 日韩在线观看一区| 伊人久久一区| 99久久夜色精品国产亚洲狼 | 亚洲天堂黄色| 欧美在线亚洲| 欧美日韩午夜电影网| 中文av在线全新| 日韩精品一二三| 国产一区二区三区不卡av| 午夜亚洲一区| 国产伊人久久| 欧美视频二区| 亚洲一区观看| 日韩欧美午夜| 麻豆网站免费在线观看| 精品精品久久| 国产自产自拍视频在线观看| 怡红院精品视频在线观看极品| 91成人精品| 极品裸体白嫩激情啪啪国产精品| 日韩国产在线观看| 偷拍精品精品一区二区三区| 精品三级在线| a日韩av网址| 新版的欧美在线视频| 欧美特黄一区| 欧美日韩一区二区高清| 国产精品主播| 99视频精品全部免费在线视频| 一级成人国产| 精品国产91| 国产一区丝袜| 久久精品日韩欧美| 国产日韩亚洲欧美精品| 石原莉奈在线亚洲三区| 精品视频在线观看网站| 欧美aaaaaa午夜精品| 欧美激情 亚洲a∨综合| 国产亚洲欧美日韩精品一区二区三区 | 青草国产精品| 亚洲三区欧美一区国产二区| 国产成人精品三级高清久久91| 国产一区二区三区久久| 婷婷综合亚洲| 国产欧美精品久久| 久久久久久久久丰满| 日本电影久久久| 国产精品蜜月aⅴ在线| 欧洲毛片在线视频免费观看| 国产精品亚洲四区在线观看| 亚洲韩日在线| 欧美aa在线视频| 国产亚洲在线| 四虎成人av| 亚洲精品看片| 99成人在线视频| 清纯唯美亚洲综合一区| 亚洲福利久久| 国产精品国码视频| 亚洲日本国产| 欧美精品高清| 精品国产精品国产偷麻豆| 亚洲精华国产欧美| 三上悠亚国产精品一区二区三区| 欧美一区91| 免费观看久久久4p| 欧美日韩在线网站| 欧美激情国产在线| 久久av日韩| 国产免费久久| 日本色综合中文字幕| 美女久久一区| 国产亚洲亚洲| 自拍日韩欧美| 国产精品激情电影| 日韩av在线免费观看不卡| 亚洲无线观看| 麻豆视频一区| 精品国产第一福利网站| 久久男女视频| 欧美激情在线精品一区二区三区| 国产视频一区欧美| 久久免费黄色| 深夜福利视频一区二区| 精品国产网站| 免费在线播放第一区高清av| 日韩欧美美女在线观看| 日韩精品一级中文字幕精品视频免费观看 | 久久亚洲二区| 在线日韩中文| 欧美91福利在线观看| 日韩欧美网址| 午夜精品成人av| 久久精品成人| 久久国产亚洲精品| 久久婷婷丁香| 亚洲手机在线| av不卡在线| 蜜桃传媒麻豆第一区在线观看| 亚洲欧美高清| 玖玖玖国产精品| 亚洲精选久久| 国产午夜久久av| 国产精品极品| 久久女人天堂| 亚洲天堂资源| 久久中文字幕二区| 一区久久精品| 综合在线一区| 国产日韩欧美高清免费| 国产精品日韩精品中文字幕| 久久只有精品| 97欧美在线视频| 丝袜av一区| 欧美日韩国产传媒| 日韩中文字幕不卡| 欧美日韩一区二区三区在线电影| 国产高清视频一区二区| 久久午夜影院| 福利在线免费视频| 国产一区日韩一区| 亚洲一区二区三区无吗| 久久精品97| 日韩伦理在线一区| 亚洲精品888| 亚洲精品影视| 久久免费福利| 999久久久国产精品| 男人操女人的视频在线观看欧美| 日本99精品| 成人午夜毛片| 欧美天堂亚洲电影院在线观看| 蜜臀91精品一区二区三区| 欧美日韩夜夜| 国产a亚洲精品| 亚洲韩日在线| 日韩av中文字幕一区二区| 精品香蕉视频| 亚洲免费激情| 国产丝袜一区| 久久久久美女| 日韩二区三区在线观看| 国产在线不卡一区二区三区| 欧美成人综合| 亚洲精品三级| 综合日韩av| 免费视频最近日韩| 精品一区二区三区中文字幕 | av亚洲免费| 亚洲97av| 狠狠躁少妇一区二区三区| 美日韩精品视频| 欧美a一区二区| 黄色欧美日韩| 久久精品国产成人一区二区三区| 亚洲国产一区二区三区在线播放 | 日韩在线观看一区二区三区| 国产成人久久精品麻豆二区 | 国产精品人人爽人人做我的可爱| 国产日产一区| 亚洲福利精品| 久久不卡日韩美女| 亚洲综合电影一区二区三区| 久久影院资源站| 在线精品观看| 国产成人精品亚洲日本在线观看| 日韩区一区二| 欧美丝袜一区| 免费在线日韩av| 水野朝阳av一区二区三区| 国产一区二区亚洲| 日韩综合小视频| 久久久久久久久丰满| 日本少妇精品亚洲第一区| 久久久久国产| 欧美a在线观看| 亚洲最大av| 国内精品福利| 福利视频一区|