Skip to content

Inconsistency between #compareTo an isXxx comparison methods #102

Open
@marschall

Description

@marschall

Judging from the RI the contract of MonetaryAmount#compareTo seems to be to first compare by currency code (not by currency, even though CurrencyUnit is Comparable) before comparing by numeric value. However all the convenience comparison methods #isGreaterThan, #isGreaterThanOrEqualTo, #isLessThan, #isLessThanOrEqualTo, #isEqualTo are specified to throw MonetaryException if the currency code (not the currency) is different.

This leads to the following behavior:

FastMoney money = FastMoney.of(BigDecimal.valueOf(2L), CHF);

assertTrue(money.compareTo(FastMoney.of(BigDecimal.valueOf(1L), EUR)) < 0); // passes

assertTrue(money.isLessThan(FastMoney.of(BigDecimal.valueOf(1L), EUR))); // throws MonetaryException

This may be an issue with the RI and not the API, as the API gives no guidance on how #compareTo should be implemented. However the API requires that #equals considers the currency unit and that best practices are that a.equals(b) implies a.compareTo(b) == 0 .

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions