返回顶部
首页 > 资讯 > 精选 >如何使用JML改进你的Java程序
  • 924
分享到

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

2023-06-03 05:06:59 924人浏览 安东尼
摘要

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

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

JML起步

XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" /> 

使用JML 改进你的Java程序

by Joe Verzulli (Mailto:joe55055@yahoo.com">joe55055@yahoo.com)

Http://www-106.ibm.com/developerworks/java/library/j-jml.html

Java建模语言(Java Modeling Language,JML)是一种进行详细设计的符号语言,他鼓励你用一种全新的方式来看待Java的类和方法。本教程中,Java程序设计资深顾问Joe Verzulli 将会给大家介绍这一新的工具以及如何使用这个工具。

面向对象的分析和设计(ooaD)的一个重要原则就是过程性的思考应该尽可能地推迟,不过遵循这个原则的大多数人也不过是把这个原则适用到方法实现这个级别上。一旦设计好了类和接口,下面的事情自然就是实现其中定义的方法了。对呀,我们还能做什么呢?还有什么其它方法可以使用吗?毕竟,用Java进行程序设计和用其他语言进行程序设计一样,我们都要一步一步地实现每一个方法。

标记本身只是表示如何做一个事情(how to do something),根本不管我们希望做什么。如果我们在做一个事情之前就能够知道我们能够达到什么样的结果是非常好的,不过Java语言并没有给我们提供一个可以显示地把这些信息插入到我们程序代码的方法。

Java建模语言(Java Modeling Language,JML)在Java代码中增加了一些符号,这些符号用来标识一个方法是干什么的,却并不关心它的实现。如果使用JML的话,我们就能够描述一个方法的预期的功能而不管他如何实现。通过这种方式,JML把过程性的思考延迟到方法设计中,从而扩展了面向对象设计的这个原则。

JML引入了大量用于描述行为的结构,比如有模型域、量词、断言可视范围、预处理、后处理、条件继承以及正常行为(与异常行为相对)规范等等。这些结构使得JML非常强大,不过你并不必要理解或者使用上面所述的所有方面,也不需要一次使用所有的这些方面。你可以一点一点的学习,从非常简单的开始。

这篇文章中采用循序渐进的方式来介绍JML。我们要先了解一下使用JML的各种好处,特别是对开发和编译过程的影响。然后,我们要讨论一下JML的一些结构,比如前置条件、后置条件、模型域、量词、副作用以及异常行为等等。同时,在讨论这些结构的同时,我们会给出一些例程来给你一个直观的感觉。这样经过本文的学习,你将可以对JML是如何工作的有一个概念性的理解,从而能够在你自己的项目中应用JML。

JML概览


使用JML来声明性地描述一个方法或类的预期行为可以显著提高整体的开发进程。把建模标记加入到你的Java程序代码中有以下好处:

  • 能够更为精确地描述这些代码是做什么的

  • 能够高效地发现和修正程序中的bug

  • 可以在应用程序升级时降低引入bug的机会

  • 可以提早发现客户代码对类的错误使用

  • 可以提供与应用程序代码完全一致的JML格式的文档

JML标记总是在Java注释的内部,所以对正常编译的代码没有任何影响。如果你想比较一下普通的类和使用了JML的类有什么差别的话,你可以使用一个开源的JML编译器(请参考 sources">如下地址)。用JML编译器编译的代码如果没有实现JML规范所要求的事项,运行时就会抛出一个JML异常。这个特性不仅可以帮助我们捕获代码中的bug,而且可以确保JML形式的文档可以与程序代码高度一致。

文章下面的部分,我将使用开放源代码的Jakarta Commons Collection Component (JCCC)项目中的PriorityQueue接口和BinaryHeap 类来演示JML的各种性质。在这里你可以找到使用了JML标记完整的这个两个文件。

要求和责任


本文中使用的代码(请参考 如下地址)包括开源项目JCCC中的PriorityQueue 接口。接口嘛,自然是声明了一些方法的签名,包括方法的参数类型、返回值的类型,并不涉及方法的实现。一般情况下或者只是按照Java语法要求的话,实现接口的类只要实现了接口中定义的各个方法即可,不论实现的方式是多么地离奇古怪。我们并不想这样,我们希望能够确定一个行为规范,所有实现这个接口的类都用我们指定的方式来实现这个接口中定义的方法。通过使用JML我们可以做到这一点。

考虑一下PriorityQueue接口的pop()方法,对于优先级队列来说,pop()方法应该有什么样的功能要求?最起码应该有三个:第一,如果要调用pop()方法,队列中至少要有一个元素;第二,该方法应该返回队列中优先级最高的那个元素;第三,该方法应该从队列中删除返回的那个元素。

下面代码段显示了表示满足第一个要求的JML标记:

代码段1  pop()方法功能规范的JML标记

object pop() throws NoSuchElementException;

前面已经提到,JML标记是写在Java代码的注释中的。包含JML标记的多行注释以

Object pop() throws NoSuchElementException;

ensures关键字表示后面跟着的是pop()方法返回时必须满足的后置条件。esult是一个JML关键字,它等于pop()方法的返回值。old()是一个JML函数,它返回pop()方法调用之前参数的值。

这个ensures语句包含了两个后置条件。第一,pop()方法返回的那个元素必须要从elementsInQueue删除。第二,这个返回值要与peek()方法返回的值一致。

类级别的不变量


我们现在已经看到JML能够让我们规定方法的前置条件和后置条件,它同样也允许我们指定类级别的不变量。类级别的不变量指的是进入和退出一个类中每个方法都必须满足的条件。比方说吧,//@ public instance invariant elementsInQueue != null; 就是PriorityQueue的一个不变量,它的意思是任何实现PriorityQueue的类一旦被实例化,elementsInQueue的值就不能是null。

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

--结束END--

本文标题: 如何使用JML改进你的Java程序

本文链接: https://lsjlt.com/news/233025.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用JML改进你的Java程序
    小编给大家分享一下如何使用JML改进你的Java程序,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JML起步XML:namespace prefix = o ns...
    99+
    2023-06-03
  • JML起步---使用JML 改进你的Java程序(4) (转)
    JML起步---使用JML 改进你的Java程序(4) (转)[@more@]异常行为前面给出的行为规范要求调用peek() 和 pop()方法时队列不能为空,但其实当队列空时是有可能会调用这两个方法的。如果发生这种情况,这两个方法就会抛出...
    99+
    2023-06-03
  • 使用JML 改进Java程序有什么副作用
    这篇文章主要为大家展示了“使用JML 改进Java程序有什么副作用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“使用JML 改进Java程序有什么副作用”这篇文章吧。副作用回忆一下代码段2中po...
    99+
    2023-06-03
  • 使用JML改进Java程序之量词的示例分析
    小编给大家分享一下使用JML改进Java程序之量词的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!量词(Quantification)(译者注:这里量词的...
    99+
    2023-06-03
  • 你知道如何使用Java存储API打包你的应用程序吗?
    Java存储API是一种强大的Java平台工具,可用于管理和存储Java应用程序的数据。在本文中,我们将探讨如何使用Java存储API打包应用程序,让您的应用程序更加高效、可靠。 Java存储API简介 Java存储API是Java平台提供...
    99+
    2023-06-29
    存储 api 打包
  • 如何在Python中使用NumPy API改进Spring应用程序?
    在现代软件开发中,Spring框架是非常流行的一种Java开发框架。Python也是一种非常流行的编程语言,因此将Python和Spring框架结合起来,可以使Spring应用程序更加高效和易于开发。在本篇文章中,我们将介绍如何使用Pyth...
    99+
    2023-09-26
    api numpy spring
  • Go 和 JavaScript:如何使用重定向来改进你的编程技能?
    重定向是Web开发中一个非常基础的概念,它在很多场景下都非常有用。在本文中,我们将介绍如何使用 Go 和 JavaScript 来实现重定向,并且解释一些基础概念和技术。 什么是重定向? 重定向是指将用户从一个 URL 地址重定向到另一个...
    99+
    2023-06-17
    javascript shell 重定向
  • 如何使用Java Spring缓存编程算法优化你的应用程序?
    Java Spring是一个流行的开发框架,其中缓存编程算法是优化应用程序性能的关键部分。在本文中,我们将讨论如何使用Java Spring缓存编程算法来优化你的应用程序。 什么是缓存? 缓存是一种存储数据的技术,它可以通过在内存中存储数据...
    99+
    2023-09-03
    spring 缓存 编程算法
  • 如何在 Java 中使用 Windows API,让你的程序更加强大?
    Java 是一种强大的编程语言,但是有时候你可能需要使用 Windows API 扩展 Java 的功能,以便在 Windows 操作系统上运行更加高效的程序。在本文中,我们将探讨如何在 Java 中使用 Windows API,让你的程序...
    99+
    2023-08-27
    windows leetcode 打包
  • 使用Java如何获取进程的ID
    这期内容当中小编将会给大家带来有关使用Java如何获取进程的ID,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先是获取当前Java运行的Java进程ID,这个是网上常见的,也就是Java程序自身将进程I...
    99+
    2023-05-31
    java 进程 ava
  • 如何使用Python进行异步编程并在Linux上打包你的应用程序?
    Python是一种非常流行的编程语言,它的简单易学、跨平台以及丰富的第三方库使得它成为了很多开发者的首选语言。而在Python中,异步编程是非常重要的一部分,特别是在I/O密集型应用程序中,异步编程可以极大地提高应用程序的性能。本文将介绍...
    99+
    2023-09-05
    linux 异步编程 打包
  • 如何使用 Python 编程改善你的 shell 工作流程?
    在日常工作中,我们经常需要在 shell 中执行一些任务,例如文件操作、数据处理、网络请求等。虽然 shell 工具已经非常强大,但是使用 Python 编程可以更加高效地完成这些任务,同时也可以让我们的工作流程更加自动化和可维护。 在本...
    99+
    2023-08-07
    编程算法 shell linux
  • 如何使用weixin-java-miniapp配置进行单个小程序
    这篇文章给大家分享的是有关如何使用weixin-java-miniapp配置进行单个小程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在进行小程序后端接口开发方面,使用weix...
    99+
    2024-04-02
  • 如何使用JDK自带的VisualVM进行Java程序的性能分析
    这篇文章主要介绍了如何使用JDK自带的VisualVM进行Java程序的性能分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。VisualVM是什么?VisualVM是JDK...
    99+
    2023-06-02
  • 如何使用eclipse新建java程序
    打开eclipse,点击file依次选择New——Java Project输入project的名称,点finish看到多了一个study,在study上右键单击,依次选择New——Class输入类名,点finish看到已经有了一个java程...
    99+
    2020-06-28
    java入门 eclipse java 程序 新建
  • 如何在Java程序中使用Linux命令进行重定向?
    在Java程序中使用Linux命令进行重定向是一项非常有用的技能。重定向可以帮助我们将程序输出或输入重定向到文件中,或者通过管道传递给其他进程。本文将介绍如何在Java程序中使用Linux命令进行重定向。 一、重定向的基本概念 在Linux...
    99+
    2023-07-04
    重定向 linux git
  • Java 异步编程:如何让你的程序飞起来?
    在现代软件开发中,很多应用程序都需要处理大量的数据和请求,这些操作可能会造成程序的阻塞和延迟。为了避免这种情况,我们可以采用异步编程的方式,使得程序能够更快速地响应用户的请求,从而提高系统的性能和稳定性。 在 Java 编程语言中,异步编...
    99+
    2023-09-29
    异步编程 打包 load
  • Java 异步编程:如何让你的程序更高效?
    在现代的软件开发中,程序运行速度的优化已经成为了一个非常重要的话题,而异步编程正是其中一个重要的解决方案。Java 作为一种非常流行的编程语言,也提供了丰富的异步编程工具,本文将介绍如何使用 Java 异步编程来提高程序的效率。 一、什么...
    99+
    2023-09-29
    异步编程 打包 load
  • 如何使用Supervisor守护ASP.NET Core应用程序进程
    本文小编为大家详细介绍“如何使用Supervisor守护ASP.NET Core应用程序进程”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用Supervisor守护ASP.NET Core应用程序进程”文章能帮助...
    99+
    2023-06-29
  • 如何限制你的Python程序所能使用的内存
    这篇文章主要讲解了“如何限制你的Python程序所能使用的内存”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何限制你的Python程序所能使用的内存”吧!如果程序开发不当,可能会出现占用过...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作