[英]How to pass final call object in method param in java
這是我最后的電話
public final class TransferRequest implements Serializable {
private static final long serialVersionUID = 1L;
/**
* Returns a new builder for creating a transfer request.
*
* @return the first build step
*/
public static ReferenceStep builder() {
return new Builder();
}
public interface ReferenceStep {
/**
* @param transactionRef client defined transaction reference
* @return the next build step
*/
TypeStep reference(String transactionRef);
}
public interface TypeStep {
/**
* @param transactionType the transaction type for grouping transactions or other purposes
* @return the next build step
*/
AccountStep type(String transactionType);
}
public interface AccountStep {
/**
* @param accountRef the client defined account reference
* @return the next build step
*/
AmountStep account(String accountRef);
}
public interface AmountStep {
/**
* @param money the transfer amount for the account
* @return the final build step
*/
BuildStep amount(Money money);
}
public interface BuildStep {
AmountStep account(String accountRef);
TransferRequest build();
}
private static final class Builder implements ReferenceStep, TypeStep, AccountStep, AmountStep, BuildStep {
private final TransferRequest request = new TransferRequest();
private String accountRef;
@Override
public TypeStep reference(String transactionRef) {
request.transactionRef = transactionRef;
return this;
}
@Override
public AccountStep type(String transactionType) {
request.transactionType = transactionType;
return this;
}
@Override
public AmountStep account(String accountRef) {
this.accountRef = accountRef;
return this;
}
@Override
public BuildStep amount(Money money) {
request.legs.add(new TransactionLeg(accountRef, money));
accountRef = null;
return this;
}
@Override
public TransferRequest build() {
if (request.legs.size() < 2) {
throw new IllegalStateException("Expected at least 2 legs");
}
return request;
}
}
private String transactionRef;
private String transactionType;
private final List<TransactionLeg> legs = new ArrayList<TransactionLeg>();
private TransferRequest() {
}
public List<TransactionLeg> getLegs() {
return Collections.unmodifiableList(legs);
}
public String getTransactionRef() {
return transactionRef;
}
public String getTransactionType() {
return transactionType;
}
}
這是我的界面,其中包含兩種方法
public interface TransferService {
void transferFunds(TransferRequest transferRequest)
throws InsufficientFundsException, AccountNotFoundException;
List<Transaction> findTransactions(String accountRef)
throws AccountNotFoundException;
}
在實現類中,如何獲取“ getLegs()
,“ getTransactionRef()
”和“ getTransactionType()
”數據?
public void transferFunds(TransferRequest transferRequest)
throws InsufficientFundsException, AccountNotFoundException {
// Validating the legs amounts
List<TransactionLeg> legs = transferRequest.getLegs();
TransactionDO transaction = new TransactionDO(transferRequest.getTransactionRef(),transferRequest.getTransactionType(), new Date());
for (TransactionLeg leg : legs) {
AccountDO account = accountRepository.findByAccountRef(leg.getAccountRef());
if (account == null) {
throw new AccountNotFoundException("the account '"
+ leg.getAccountRef() + "' does not exist");
}
if(!account.isActive())
{
throw new AccountNotFoundException("the account '"
+ leg.getAccountRef() + "' is closed");
}
TransactionEntryDO entry = new TransactionEntryDO(transaction,
account.getAccountRef(), leg.getAmount().getAmount(), leg
.getAmount().getCurrency().toString());
Money balanceToBe;
try {
String accountCurrencyCode = account.getCurrency();
balanceToBe = MoneyUtils.add(
MoneyUtils.toMoney(account.getBalance().toString(),
accountCurrencyCode), MoneyUtils.toMoney(leg.getAmount().getAmount().toString(), accountCurrencyCode));
} catch (Exception e) {
throw new IllegalArgumentException(e.getMessage());
}
account.setBalance(balanceToBe.getAmount());
accountRepository.save(account);
transaction.getTransactionEntries().add(entry);
}
transactionRepository.save(transaction);
}
如何從測試方法調用服務隱含類。
我有些困惑。 您已經發布了TransferRequest
類的完整代碼,但是您不知道如何實例化它? 我假設您不知道生成器模式 。 您的班級是使用構建器實例化的:
TransferRequest tr = TransferRequest.builder()
.reference(...)
.type(...)
.account(...)
.amount(...)
.build();
請注意,幾個接口具有以下目的:您只能在方法builder()
的返回對象上調用方法reference(...)
builder()
。 然后,您只能調用方法type(...)
,依此類推。 這些構建器步驟迫使您以正確的順序使用構建方法。 還要注意,您可以重復調用account(...)
和amount(...)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.