$30 off During Our Annual Pro Sale. View Details »

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.

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

    View Slide

  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.

    View Slide

  3. Introduction

    View Slide

  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

    View Slide

  5. @McPringle
    17./18. Oktober 2018
    Let's talk about IT!
    20% discount:
    jcon2018

    View Slide

  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!

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  11. A bunch of new classes

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  18. Time to Code!

    View Slide

  19. Finally…

    View Slide

  20. @McPringle
    Interfaces
    ● CurrencyConversion
    ● CurrencySupplier
    ● CurrencyUnit
    ● ExchangeRate
    ● ExchangeRateProvider
    ● ExchangeRateProviderSupplier
    ● MonetaryAmount
    ● MonetaryAmountFormat
    ● MonetaryOperator
    ● MonetaryQuery
    ● MonetaryRounding
    ● NumberSupplier

    View Slide

  21. @McPringle
    Service Provider Interfaces
    ● CurrencyProviderSpi
    ● MonetaryAmountFactoryProviderSpi
    ● MonetaryAmountFormatProviderSpi
    ● MonetaryAmountsSingletonQuerySpi
    ● MonetaryAmountsSingletonSpi
    ● MonetaryConversionsSingletonSpi
    ● MonetaryCurrenciesSingletonSpi
    ● MonetaryFormatsSingletonSpi
    ● MonetaryRoundingsSingletonSpi
    ● RoundingProviderSpi

    View Slide

  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

    View Slide

  23. @McPringle
    Compatibility
    ● Supports
    ○ Java Micro Edition
    ○ Java Standard Edition
    ○ Jakarta Enterprise Edition
    ● Compatible with Java 8+
    ● Backport available for Java 7

    View Slide

  24. @McPringle
    Maven

    javax.money
    money-api
    1.0


    org.javamoney
    moneta
    1.0

    View Slide

  25. @McPringle
    Gradle
    compile(
    'javax.money:money-api:1.0',
    'org.javamoney:moneta:1.0'
    )

    View Slide

  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

    View Slide

  27. One more thing…

    View Slide

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

    View Slide

  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: [email protected]

    View Slide

  30. @McPringle
    https://fihlon.ch/jcon18

    View Slide