我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用JML改进Java程序之量词的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用JML改进Java程序之量词的示例分析

小编给大家分享一下使用JML改进Java程序之量词的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

量词(Quantification(译者注:这里量词的意思与逻辑学上的量词意思相近,而不是普通意义上理解的量词。)XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />


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

代码段3  PriorityQueue peek()方法的行为规范

object peek() throws NoSuchElementException;

JML标记要求只有当队列中至少含有一个元素的时候,才能调用peek()方法,同时他还要求方法的返回值必须在elementsInQueue之内,也就是说,这个返回值一定是这个队列中的一个元素。

注释 表明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模型变量isMinimumHeap来判断BinaryHeap的排序方式是大顶堆还是小顶堆。下面的例子是BinaryHeap使用isMinimumHeap给peek()方法定义的行为规范:

代码段4  BinaryHeap 类中peek()方法的行为规范

public Object peek() throws NoSuchElementException

使用量词


上面代码段4中的后置条件包含两个部分,分别用于大顶堆和小顶堆的情况。“==>”符号的意思是包含(译者注:这个包含与逻辑学中包含的意思一致)。x ==> y 当且仅当y为真或x为假时取真值。对于小顶堆排序来说,适用下面所列的代码:

(forall Object obj;

  elementsInQueue.has(obj);

  compareObjects(esult, obj) <= 0)

上面的代码中forall是一个JML量词。上面forall表达式当所有的对象obj满足elementsInQueue.has(obj)为真且compareObjects(esult, obj)返回一个非正数两个条件时才为真。换言之,当使用compareObjects()进行比较时,peek()方法的返回值一定小于或等于elementsInQueue中每一个元素的值。其他的JML量词还有exists、sum以及 min等等。

使用Comparator进行比较


BinaryHeap类允许以两种方法比较元素的大小。一种方法是要进行比较的元素自己实现Comparable接口,比较过程使用元素中定义的方法进行。另外一种方法是客户类在构造BinaryHeap类的实例时向构造函数传入一个Comparator对象,使用该Comparator对象进行比较。无论使用哪一种比较方式,我们都使用模型域comparator来表示比较大小所用的Comparator对象。 在peek()方法的后置条件中,compareObjects()方法使用客户端选择的比较方式来进行元素的比较。compareObjects()方法定义如下:

代码段5  compareObjects() 方法

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语句:

代码段6  elementsInQueue represents语句

从这里我们可以看出,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 语句<-符号右边的代码并进行求值。

以上是“使用JML改进Java程序之量词的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用JML改进Java程序之量词的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用JML改进Java程序之量词的示例分析

小编给大家分享一下使用JML改进Java程序之量词的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!量词(Quantification)(译者注:这里量词的
2023-06-03

JML起步---使用JML 改进你的Java程序(4) (转)

JML起步---使用JML 改进你的Java程序(4) (转)[@more@]异常行为前面给出的行为规范要求调用peek() 和 pop()方法时队列不能为空,但其实当队列空时是有可能会调用这两个方法的。如果发生这种情况,这两个方法就会抛出
2023-06-03

如何使用JML改进你的Java程序

小编给大家分享一下如何使用JML改进你的Java程序,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JML起步XML:namespace prefix = o ns
2023-06-03

Java流程控制之顺序结构的示例分析

这篇文章主要介绍了Java流程控制之顺序结构的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java中的流程控制语句可以这样分类:顺序结构,选择结构,循环结构。1.关
2023-06-22

使用Python编程语言进行实践的示例分析

这篇文章将为大家详细讲解有关使用Python编程语言进行实践的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。其实Python真的挺有意思的,用Python用做过不少有趣好玩的事儿,这
2023-06-02

VS2008程序某些组件使用不当的示例分析

这篇文章将为大家详细讲解有关VS2008程序某些组件使用不当的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我的电脑是Vista系统,装了VS2008程序,最近由于某些原因必须要装VS2005,请
2023-06-17

微信小程序开发中变量值共用的示例分析

这篇文章将为大家详细讲解有关微信小程序开发中变量值共用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  7月16日开始,阿里巴巴国际站将实施重复铺货处罚新规。对于重复铺货商品占“审核通过且已上架
2023-06-26

线程局部变量使用与多线程开发的示例分析

这篇文章主要为大家展示了“线程局部变量使用与多线程开发的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“线程局部变量使用与多线程开发的示例分析”这篇文章吧。一、概述现在多核时代多线程开发越
2023-06-17

微信小程序在{{ }}中直接使用函数的示例分析

这篇文章主要介绍了微信小程序在{{ }}中直接使用函数的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言在微信小程序开发中(原生wxml、wxcss),想直接在{{
2023-06-20

如何使用JDK自带的VisualVM进行Java程序的性能分析

这篇文章主要介绍了如何使用JDK自带的VisualVM进行Java程序的性能分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。VisualVM是什么?VisualVM是JDK
2023-06-02

介绍微信小程序开发之用户授权登录的示例分析

这篇文章将为大家详细讲解有关介绍微信小程序开发之用户授权登录的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。准备:微信开发者工具下载地址:https://developers.weixin.qq.
2023-06-14

Java应用程序中内存泄漏及内存管理的示例分析

这篇文章主要介绍Java应用程序中内存泄漏及内存管理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!btw,一些静态代码扫描工具也能检测出不好的编程习惯带来潜在的内存泄露的风险。Java平台的一个突出的特性是
2023-06-02

微信小程序中引入并使用自带和外部图标的示例分析

这篇文章主要介绍微信小程序中引入并使用自带和外部图标的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!自带图标
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录