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

Go for the Money! JSR-354 @ JFS 2017

Go for the Money! JSR-354 @ JFS 2017

July 6, 2017 @ JFS 2017

**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

July 06, 2017
Tweet

More Decks by Marcus Fihlon

Other Decks in Programming

Transcript

  1. Go for the Money! JSR-354
    A quick introduction to the Java Money and Currency API
    Marcus Fihlon
    July 6, 2017
    Scrum Master | Software Engineer | Lecturer | Speaker | Author

    View Slide

  2. 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.
    1

    View Slide

  3. Session Material
    Slides, Code, Video
    http://fihlon.ch/jfs17
    2

    View Slide

  4. About Me
    Software Engineer
    CSS Insurance, Open Source Software
    Agile Coach
    CSS Insurance
    Lecturer
    TEKO Swiss Technical College
    Speaker
    Conferences, User Groups, Meetups
    Author
    Articles, Books
    www.fihlon.ch | github.com | hackergarten.net | jug.ch
    3

    View Slide

  5. 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!
    4

    View Slide

  6. 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)
    5

    View Slide

  7. 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
    6

    View Slide

  8. 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
    7

    View Slide

  9. 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
    8

    View Slide

  10. Highway of slides…

    View Slide

  11. 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
    9

    View Slide

  12. 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
    10

    View Slide

  13. 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
    11

    View Slide

  14. 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
    12

    View Slide

  15. 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
    13

    View Slide

  16. 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
    14

    View Slide

  17. Live Coding

    View Slide

  18. Wrap-up

    View Slide

  19. Interfaces
    CurrencyConversion
    CurrencySupplier
    CurrencyUnit
    ExchangeRate
    ExchangeRateProvider
    ExchangeRateProviderSupplier
    MonetaryAmount
    MonetaryAmountFormat
    MonetaryOperator
    MonetaryQuery
    MonetaryRounding
    NumberSupplier
    15

    View Slide

  20. Service Provider Interfaces
    CurrencyProviderSpi
    MonetaryAmountFactoryProviderSpi
    MonetaryAmountFormatProviderSpi
    MonetaryAmountsSingletonQuerySpi
    MonetaryAmountsSingletonSpi
    MonetaryConversionsSingletonSpi
    MonetaryCurrenciesSingletonSpi
    MonetaryFormatsSingletonSpi
    MonetaryRoundingsSingletonSpi
    RoundingProviderSpi
    16

    View Slide

  21. Validation
    Money Validation by Zalando
    Validate monetary amounts
    Uses existing, standardized constraints
    Offers additional, more expressive custom constraints
    Can be use with any Bean Validation implementation
    1 @Min
    2 @Max
    3 @DecimalMin
    4 @DecimalMax
    5 @Positive
    6 @PositiveOrZero
    7 @Negative
    8 @NegativeOrZero
    9 @Zero
    17

    View Slide

  22. Compatibility
    Supports
    Java Micro Edition
    Java Standard Edition
    Java Enterprise Edition
    Compatible with Java 8+
    Backport available for Java 7
    18

    View Slide

  23. Maven
    pom.xml
    1
    2 javax.money
    3 money-api
    4 1.0.1
    5
    6
    7 org.javamoney
    8 moneta
    9 1.1
    10
    19

    View Slide

  24. Gradle
    build.gradle
    1 compile(
    2 'javax.money:money-api:1.0.1',
    3 'org.javamoney:moneta:1.1'
    4 )
    20

    View Slide

  25. 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
    21

    View Slide

  26. The End
    Thank You! Questions?
    http://fihlon.ch/jfs17
    22

    View Slide