说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Java 9中新的货币API

HTML文档下载 WORD文档下载 PDF文档下载
此前,Oracle公布Java 9首个增强计划集(众所周知的JEPs)确定会在2016年早些时候发布。而目前,JSR 354定义了一套新的Java货币API,计划会在Java 9中正式引入。

JSR 354定义了一套新的Java货币API,计划会在Java 9中正式引入。本文中我们将来看一下它的参考实现:JavaMoney的当前进展。

正如我在之前那篇Java 8新的日期时间API一文中那样,本文主要也是通过一些代码来演示下新的API的用法 。

在开始之前,我想先用一段话来简短地总结一下规范定义的这套新的API的用意何在:

对许多应用而言货币价值都是一个关键的特性,但JDK对此却几乎没有任何支持。严格来讲,现有的java.util.Currency类只是代表了当前ISO 4217货币的一个数据结构,但并没有关联的值或者自定义货币。JDK对货币的运算及转换也没有内建的支持,更别说有一个能够代表货币值的标准类型了。

如果你用的是Maven的话,只需把下面的引用添加到工里面便能够体验下该参考实现的当前功能了:

<dependency>  <groupId>org.javamoney</groupId>  <artifactId>moneta</artifactId>  <version>0.9</version></dependency>

规范中提到的类及接口都在javax.money.*包下面。

我们先从核心的两个接口CurrencyUnit与MonetaryAmount开始讲起。

CurrencyUnit及MonetaryAmount

CurrencyUnit代表的是货币。它有点类似于现在的java.util.Currency类,不同之处在于它支持自定义的实现。从规范的定义来看,java.util.Currency也是可以实现该接口的。CurrencyUnit的实例可以通过MonetaryCurrencies工厂来获取:

// 根据货币代码来获取货币单位 CurrencyUnit euro = MonetaryCurrencies.getCurrency("EUR");    CurrencyUnit usDollar = MonetaryCurrencies.getCurrency("USD"); // 根据国家及地区来获取货币单位    CurrencyUnit yen = MonetaryCurrencies.getCurrency(Locale.JAPAN); CurrencyUnit    canadianDollar = MonetaryCurrencies.getCurrency(Locale.CANADA);
MontetaryAmount代表的是某种货币的具体金额。通常它都会与某个CurrencyUnit绑定。MontetaryAmount和CurrencyUnit一样,也是一个能支持多种实现的接口。CurrencyUnit与MontetaryAmount的实现必须是不可变,线程安全且可比较的。

/ get MonetaryAmount from CurrencyUnitCurrencyUnit euro = MonetaryCurrencies.getCurrency("EUR");MonetaryAmount fiveEuro = Money.of(5, euro); // get MonetaryAmount from currency codeMonetaryAmount tenUsDollar = Money.of(10, "USD"); // FastMoney is an alternative MonetaryAmount factory that focuses on performanceMonetaryAmount sevenEuro = FastMoney.of(7, euro);

Money与FastMoney是JavaMoney库中MonetaryAmount的两种实现。Money是默认实现,它使用BigDecimal来存储金额。FastMoney是可选的另一个实现,它用long类型来存储金额。根据文档来看,FastMoney上的操作要比Money的快10到15倍左右。然而,FastMoney的金额大小与精度都受限于long类型。

注意了,这里的Money和FastMoney都是具体的实现类(它们在org.javamoney.moneta.*包下面,而不是javax.money.*)。如果你不希望指定具体类型的话,可以通过MonetaryAmountFactory来生成一个MonetaryAmount的实例:

MonetaryAmount specAmount = MonetaryAmounts.getDefaultAmountFactory()                .setNumber(123.45) .setCurrency("USD") .create();
当且仅当实现类,货币单位,以及数值全部相等时才认为这两个MontetaryAmount实例是相等的。
苹果收购LinX:iPhone或将采用双摄像头技术 Google《Android性能优化》学习笔记 Amaze UI 2.3.0版本发布 整合多个第三方插件 专访Layabox创始人谢成鸿:Flash与HTML5结合的背后 高德推“LBS+”开放平台战略 整合位置大数据和云计算 Nokia7210 的模拟器为何比WTK中缺省的模拟器执行速度慢? 我想兼职 msn:yuanyi12@hotmail.com 南京 别人给我的一个ping函数,不知道包的大小在那个地方设置,帮忙一下! 急需算法:SPRINT SLIQ k-Nearest Neighbor源代码!!!要多少分都给!!! 怎么添加函数库 在c#中编写网上考试程序!如何控制考试时间!? 文件传输 再问一下”如何声明一个这样的数组“ 请教高手,tomcat4.1.27的exe版本的xxx.jar文件如何放置?着急的不行!!!! 冰箱一般长时间不用内漏,如何判断是高压还是低压漏? 正确判断冰箱是低压漏还是高压漏 卷帘门弹簧怎么配,比如门的高度+帘片每平米的重量. 怎么配制卷帘门弹簧 关于如何画物理的受力图在高中范围内,受力图一定要画 三角恒等变换的这么多公式该怎么记忆? 如果地面变形缝要求铝合金厚度需要多少?华安润成变形 2.4米宽的卷帘门要多长的簧 那位师傅有简单的判断冰箱是高压漏还是低压漏 伤医案频发凸显医患冲突 医患之间更加强风暴袭击欧洲多国美窃听惹到愤怒的公牛 1个月监听西班日媒称安倍秀强硬让中日问题难解决 损蒙古总统到参谒朝鲜锦绣山太阳宫国企领导“利益输送”问题最为突出王天一郑惟桐晋级八强尼日利亚选举为此“让路”CBA对阵(1/4淘汰赛)国家安全战略韩娱之我与妹妹仙丁超能力者混都市以罪为名折戟移灵:盗墓者的经历周庄纸箱王主题创意餐厅旅游镇朔楼旅游龙津风雨桥旅游瑶湖旅游天宝岩旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘