BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

JSR-275:单位和计量

| 作者 Geoffrey Wiseman 关注 0 他的粉丝 ,译者 郭晓刚 关注 0 他的粉丝 发布于 2007年10月18日. 估计阅读时间: 4 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT