簡體   English   中英

如何在Java中的方法參數中傳遞最終調用對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM