Простой ответ: вы не можете сделать это легко.Вы должны сделать так, чтобы различные типы в системе зависели так или иначе.В моем первом примере я использую исключение в сигнатуре perform
methdod, чтобы указать, что может произойти что-то ужасное, если будет вызван perform
.Это необходимо реализовать.
interface Account {
double getBalance();
/**
* Indicates if an order can be performed by the account.
*
* @retrun {@code true} if the balance is bigger than the order's amount, {@code false} else.
*/
boolean canPerform(Order order);
/**
* @param order The order to apply.
* @throws Exception when the amount of the order is higher than the value returned by #getBalance.
*/
boolean perform(Order order) throws Exception;
}
interface Order { double getAmount(); }
interface Transaction { boolean transact(Account account, Order order) }
Другой способ моделирования зависимостей, избегая исключения и (мы надеемся) создавать новые Transaction
экземпляры, когда perform
вызывается:
interface Account {
double getBalance();
/**
* @param order The order to apply.
* @throws Exception when the amount of the order is higher than the value returned by #getBalance.
*/
Transaction perform(Order order);
}
interface Order { double getAmount(); }
interface Transaction { TransactionState getState(); }
enum TransactionState { SUCCESS, ERROR }