© Excellent backgrounds/Shutterstock.com
Teil 3: SPIs für Konversion, Formatierung und Lifecycle

My Code works hard for the Money


In den vorangehenden Artikeln haben wir das API von JSR 354 [1] und einen ersten Teil des SPI vorgestellt. In diesem Artikel zeige ich nun, wie Konversionen und Formate erweitert werden können und wie der Bootstrap-Mechanismus eine transparente Integration mit Java EE erlaubt.

Das API für Währungskonversion befindet sich im Paket javax.money.conversion. Die Schlüsselklasse, die eine einzelne Konversion modelliert, ist die ExchangeRate (Listing 1). Eine Instanz dieser Schnittstelle definiert den Multiplikator (factor), der angewendet auf einen Betrag in der Quellwährung (baseCurrency) den entsprechenden Betrag in der Zielwährung (currency) ergibt. Da es in Abhängigkeit des aktuellen Anwendungsfalls viele solcher Multiplikatoren geben kann, kommt noch ein Kontext (ConversionContext) hinzu, der genauer beschreibt, um welche Art der Konversion es sich handelt.

Artikelserie

Teil 1: Grundlagen: API und Usage

Teil 2: SPI: Basics, Rundungen und Währungen

Teil 3: SPI: Konversion, Formatierung und Java EE

Listing 1

public interface ExchangeRate extends CurrencySupplier { NumberValue getFactor(); CurrencyUnit getBaseCurrency(); CurrencyUnit getCurrency(); ConversionContext getContext(); List<ExchangeRate> getExchangeRateChain(); default boolean isDerived(){...} }

Nun soll eine zusätzliche Währungskonversion auf Basis des RSS Feeds der US Federal Reserve Bank [2] bereitgestellt werden, d. h. wir müssen einen ExchangeRateProvider (Listing 2) implementieren. Das Federal Reserve System (FED) liefert dabei immer Konversionsdaten auf Basis des US-Dollar-Kurses der Vorwoche. Folglich unterstützt unsere Implementierung nur Raten vom Typ RateType.HISTORIC und BaseCurrency=USD. Mit diesen Informationen können wir bereits den ProviderContext definieren, der unseren Provider genauer beschreibt und beim Aufruf von getContext() zurückgegeben werden muss (Listing 3).

Listing 2

public interface ExchangeRateProvider{ ProviderContext getContext(); ExchangeRate getExchangeRate(ConversionQuery conversionQuery); CurrencyConversion getCurrencyConversion(ConversionQuery conversionQuery); default boolean isAvailable(ConversionQuery conversionQuery){...} default ExchangeRate getExchangeRate(CurrencyUnit base,CurrencyUnit term){...} default CurrencyConversion getCurrencyConversion(CurrencyUnit term){...} default boolean isAvailable(CurrencyUnit base, CurrencyUnit term){...} default boolean isAvailable(String baseCode, String termCode){...} default ExchangeRate getExchangeRate(String ba...

Exklusives Abo-Special

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang