Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go for the Money! JSR-354 @ JCON 2018

Go for the Money! JSR-354 @ JCON 2018

In the last years the development of the Java language itself is going on more rapidly and some long-awaited features were implemented. The best-known are the new Date & Time API and Lambdas & Streams. Specially for business applications there was another very interesting feature released in May 2015: JSR-354 – Money and Currency API

What is this JSR about, why is there a need for a Money and Currency API? After answering these questions I provide an overview about the new API, their packages and classes with usage examples. I show how to calculate with money objects, how to convert between currencies, how to format and how to parse values using the Money and Currency API.

The Money and Currency API is compatible with Java 8 and newer. At the end of my talk there is a demonstration, where I show how an application can use the new Money and Currency API in practice. To fully understand this talk the attendees should have basic knowledge of Java.

0e03060bbd51f78ca975631e117b9213?s=128

Marcus Fihlon

October 11, 2018
Tweet

More Decks by Marcus Fihlon

Other Decks in Technology

Transcript

  1. Go for the Money! JSR-354 A quick introduction to the

    Java Money and Currency API Marcus Fihlon @McPringle October 11, 2018 Düsseldorf
  2. @McPringle Disclaimer The following presentation has been approved for open

    audiences only. Hypersensitivity to occasional profanity requires covering ears. All logos, photos etc. used in this presentation are the property of their respective copyright owners and are used here for educational purposes only. Any and all marks used throughout this presentation are trademarks of their respective owners. The presenter is not acting on behalf of CSS Insurance, neither as an official agent nor representative. The views expressed are those solely of the presenter. Marcus Fihlon disclaims all responsibility for any loss or damage which any person may suffer from reliance on this information or any opinion, conclusion or recommendation in this presentation whether the loss or damage is caused by any fault or negligence on the part of presenter or otherwise.
  3. Introduction

  4. @McPringle About me • Agile Coach CSS Insurance • Software

    Engineer CSS Insurance, Open Source Software • Lecturer TEKO Swiss Technical College • Speaker Conferences, User Groups, Meetups • Author Articles, Books • Community Leader Hackergarten, Java User Group Switzerland, Kotlin Swiss User Group, Voxxed Days Zürich, BaselOne
  5. @McPringle 17./18. Oktober 2018 Let's talk about IT! 20% discount:

    jcon2018
  6. @McPringle What to expect • History A brief retrospect in

    time. • Motivation Why do we need a new API? • Requirements Requirements for the new API. • Boring slides Some theoretic stuff about the JSR-354. • Source code Because we are hackers!
  7. @McPringle History • float, double since Java 1 • java.math.BigDecimal

    since Java 1.1 • java.text.DecimalFormat since Java 1.1 • java.util.Currency since Java 1.4
  8. @McPringle Motivation • Monetary values are a key feature for

    many applications • java.util.Currency is a structure for ISO-4217 only • No support for historic or virtual currencies • No support for currency arithmetic or conversion • No standard value type to represent a monetary amount • java.text.DecimalFormat lacks flexibility
  9. @McPringle Requirements • Easy addition and modification of currencies •

    Currencies need a context and should be client-aware • Standard API for money amounts, rounding, conversions • Easy, flexible, complex, individual formatting and parsing • Clearly defined extension points • Follow the design principles of the Java platform • Compatibility with Standard Edition and Micro Edition • No external dependencies • Interoperability with existing artefacts • Support functional programming style
  10. @McPringle Three years of hard work • JSR-354 started early

    2012 • JSR-354 early draft review in 2013 • Reference implementation startet late 2013 • Final release of JSR-354 early 2015 • Final release of reference implementation early 2015
  11. A bunch of new classes

  12. @McPringle Currencies • Monetary ◦ Get a currency by code

    or locale ◦ Additional API for complex queries ◦ Supports SPI to enhance functionality • CurrencyUnit ◦ Currency code (string and number) ◦ Additional context information (e.g. type, capabilities) • CurrencyQueryBuilder ◦ Builder for complex queries for accessing currency units
  13. @McPringle Monetary Amounts • Monetary ◦ Get a monetary amount

    by currency and value ◦ Optionally specify an explicit factory ◦ Or query for a suitable factory ◦ Supports SPI to enhance functionality • MonetaryAmount ◦ Numeric value and currency ◦ Arithmetic operations to do calculations ◦ Multiple implementations ◦ Interoperability rules ◦ Additional context information (e.g. capabilities) • MonetaryAmountFactoryQueryBuilder ◦ Builder for complex queries for accessing monetary amount factories
  14. @McPringle Rounding • Monetary ◦ Get a rounding operator ◦

    Optionally specify a locale ◦ Or query for a suitable rounding operator ◦ Supports SPI to enhance functionality • MonetaryRounding ◦ Extends MonetaryOperator ◦ Multiple implementations ◦ Additional context information • RoundingQueryBuilder ◦ Builder for complex queries for accessing rounding operators
  15. @McPringle Conversion with currency conversion • MonetaryConversions ◦ Get a

    currency conversion by currency code or unit ◦ Or query for a suitable currency conversion ◦ Supports SPI to enhance functionality • CurrencyConversion ◦ Multiple implementations ◦ Source and target currency ◦ Conversion factor ◦ Additional context information ◦ Unidirectional • ConversionQueryBuilder ◦ Builder for complex queries for accessing currency conversions
  16. @McPringle Conversion with exchange rate provider • MonetaryConversions ◦ Get

    an exchange rate provider ◦ Or query for a suitable currency conversion ◦ Supports SPI to enhance functionality • ExchangeRateProvider → ExchangeRate ◦ Multiple implementations ◦ Source and target currency ◦ Conversion factor ◦ Additional context information ◦ Unidirectional • ConversionQueryBuilder ◦ Builder for complex queries for accessing exchange rate providers
  17. @McPringle Formatting and parsing • MonetaryFormats ◦ Get a monetary

    amount format ◦ Optionally specify a locale ◦ Or query for a suitable monetary amount format ◦ Supports SPI to enhance functionality • MonetaryAmountFormat ◦ Multiple implementations ◦ Additional context information ◦ Format monetary amounts ◦ Parse monetary amounts • AmountFormatQueryBuilder ◦ Builder for complex queries for accessing monetary amount formats
  18. Time to Code!

  19. Finally…

  20. @McPringle Interfaces • CurrencyConversion • CurrencySupplier • CurrencyUnit • ExchangeRate

    • ExchangeRateProvider • ExchangeRateProviderSupplier • MonetaryAmount • MonetaryAmountFormat • MonetaryOperator • MonetaryQuery • MonetaryRounding • NumberSupplier
  21. @McPringle Service Provider Interfaces • CurrencyProviderSpi • MonetaryAmountFactoryProviderSpi • MonetaryAmountFormatProviderSpi

    • MonetaryAmountsSingletonQuerySpi • MonetaryAmountsSingletonSpi • MonetaryConversionsSingletonSpi • MonetaryCurrenciesSingletonSpi • MonetaryFormatsSingletonSpi • MonetaryRoundingsSingletonSpi • RoundingProviderSpi
  22. @McPringle Validation Money Validation by Zalando • Validate monetary amounts

    • Uses existing, standardized constraints • Offers additional, more expressive custom constraints • Can be used with any Bean Validation implementation @Zero, @Min, @Max, @DecimalMin, @DecimalMax, @Positive, @PositiveOrZero, @Negative, @NegativeOrZero
  23. @McPringle Compatibility • Supports ◦ Java Micro Edition ◦ Java

    Standard Edition ◦ Jakarta Enterprise Edition • Compatible with Java 8+ • Backport available for Java 7
  24. @McPringle Maven <dependency> <groupId>javax.money</groupId> <artifactId>money-api</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.javamoney</groupId> <artifactId>moneta</artifactId>

    <version>1.0</version> </dependency>
  25. @McPringle Gradle compile( 'javax.money:money-api:1.0', 'org.javamoney:moneta:1.0' )

  26. @McPringle Links • Java Money Umbrella Site http://javamoney.org/ • JSR-354

    Specification http://javamoney.github.io/api.html • JSR-354 Reference Implementation http://javamoney.github.io/ri.html • JSR-354 Technical Compatibility Kit http://javamoney.github.io/tck.html • Java Money Financial Library http://javamoney.github.io/lib.html • Money Validation https://github.com/zalando/money-validation
  27. One more thing…

  28. @McPringle You ever dreamed of living in Switzerland?

  29. @McPringle Code Warriors wanted! About you • You are frighteningly

    awesome at what you do. • You can perform quick and deadly tactical strikes, as well as feats of epic badassery. Sometimes both at the same time. • You would rather refactor existing, mostly working, ugly code instead of rewriting it from scratch. OK nobody would really rather do that, but you know it's the right and honorable thing to do most of the time. • You know where your towel is. About us • Biggest Basic Health Insurance Company • 2800 Employees • 300 IT Professionals • 24 Scrum Teams • 130 Software Developers • Flexible working times • Personal development support • 6 weeks paid vacation • Great benefits • Located in Lucerne, Switzerland Contact me: marcus.fihlon@css.ch
  30. @McPringle https://fihlon.ch/jcon18