InfoQ

新闻

JSR-275:单位和计量

作者 Geoffrey Wiseman译者 郭晓刚 发布于 2007年10月17日 下午2时21分

社区
Java
主题
调查

JSR-275:单位规范》的目标是为Java软件开发增加计量单位的支持,以期能减少某些类型的错误。该规范的领导之一Jean-Marie Dautelle为我们介绍这个API:

不恰当的物理测量模型会导致严重的程序设计错误。特别是将计量建模成单纯的数字而不管其代表的单位,会产生出脆弱的代码。其他开发者或者代码的其他部分都可能会错误地把数字看成代表其他计量单位。例如,一个人的重量数字的单位到底是磅、千克还是英石,并不容易看出来。这个问题很难通过测试来解决,而且已经给社会造成了数以百万计的金钱损失。(NASA损失了价值$1.25亿的火星探测器,就因为Lockheed Martin的工程师使用英制单位,而NASA的工程师使用更适合关键太空任务的公制单位。)

JSR-275引入了一个新的javax.measure包,其中包含一个Measurable接口和一个Measure类。

Measurable表示一个属性可被量度(例如海拔、高度等),且给定一个相容的单位,可取得该属性的值:

Measurable<length> height = person.getHeight();

long inches = height.longValue(NonSI.INCH);

Measurable用泛型来保证类型安全;如果传递一个Measurable<mass>对象到一个接受Measurable<length> 参数的方法,就会产生编译错误:

Measurable<mass> weight = person.getWeight();

person.setHeight( weight ); // error!

Measure代表一个具体的计量,是一个数字值和一个具体单位的结合。一个可计量的值(如geoffreyWiseman.getHeight())可有不同的表示(如Measure.valueOf(73,NonSI.INCH)、Measure.valueOf(1.8542,SI.METRE)) 。

API中还包括了量的表示(quantities)(如质量、高度、功率、压力),用来参数化计量的泛型表示;单位(INCH、METER等)被置于单位系统中。SI表示公制,包括单位以及前缀(METER、KILO(METER)等);NonSI包含了不属于公制的常用单位(日、英尺、节等)。

可以用UnitConverter来转换同一量纲的单位。它可以解析和格式化带单位的数值,甚至包括含有不同单位的复合表示,如英尺和英寸、时分秒。这个API是可扩展的,支持创建新的单位、单位系统以及量的表示。

有些讨论谈及JSR-275来支持JSR-310(日期/时间API),这个主题还有待深入。Stephen Colebourne在《JSR-275: Suitable for Java 7?》中指出日期/时间单位在转换中不具备科学单位的一致性:

呃,我们怎样精确地在月和日之间转换?这种转换到底是什么意思?我姑且猜测,它是将1年定义为365日5小时49分12秒,然后定义1月是其1/12。然后根据这个数据进行月与日之间的转换。

更详细的信息请查阅规范或者参考实现

查看英文原文:JSR-275: Units and Measures Introduced

没有回复

回复

独家内容

专访开源项目Amoeba架构师陈思儒

DBA notes站长冯大辉(Fenng)代表InfoQ中文站采访了分布式数据库Proxy开源项目Amoeba的架构师和主要开发者陈思儒,内容包括Amoeba项目的起因、功能及其愿景等。

使用JSF、Ajax和Seam开发Portlets(2/3)

作为三期系列文章的第二部分,本文延续了上一期内容,介绍了RichFaces,包括如何把RichFaces集成到之前提到的示例应用中、如何部署RichFaces porlet和RichFaces的多种特性和功能。

Jeff Barr谈论Amazon Web服务

Amazon Web Services(AWS)的传道者Jeff Barr讨论了SimpleDB、S3、EC2、SQS、云计算、Amazon的不同服务如何与应用交互、AWS的起源、SimpleDB和微软SQL Server Data Services、AWS cloud的全球化、三月份的AWS停机。

用Erlang实现领域特定语言

Erlang的并发模型很有名,它的健壮性也很有名。但其他方面呢?在这篇文章里,Dennis Byrne演示了如何用Erlang建立内部DSL。

基于Rails的企业级应用剖析

本视频主要以FreeWheel为例,对一个基于Rails的企业级应用进行了剖析。其中包括:FreeWheel的架构、部署、数据库的问题、REST API、敏捷开发过程、如何去写测试以及持续集成等等。

JavaFX技术预览

JavaFX显示了Sun的Java系列产品市场方向的一个重大转变。随着1.0版的即将发布,InfoQ以JavaFX预览版为参考,与Sun高级工程师Joshua Marinacci探讨了即将发布的1.0正式版。

剖析短迭代

敏捷教练Dave Nicolette提出:我们应该如何设定迭代长度?是要根据发布周期的时间么?使用短迭代又有哪些好处?

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。