java - 如何在java中的方法参数中传递最终调用对象

标签 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 类的完整代码,但您不知道如何实例化它?我假设您不知道 builder pattern 。您的类是使用构建器实例化的:

TransferRequest tr = TransferRequest.builder()
        .reference(...)
        .type(...)
        .account(...)
        .amount(...)
        .build();

请注意,这几个接口(interface)具有以下用途:您只能对 builder() 方法返回的对象调用方法 reference(...)。那么只能调用方法type(...),以此类推。这些builder steps强制您按正确的顺序使用构建方法。另请注意,您可以重复调用 account(...)amount(...)

关于java - 如何在java中的方法参数中传递最终调用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35111208/

相关文章:

java - 在 Netbeans 中程序运行顺利,在命令行中我得到一个 JavaNoClassDefFoundError

java - Springdoc 指定安全性为开放

java - 检测/控制过程

java - Gson:如何在使用流 api 解析时跳过 JSON 数组中的行

Java 在加载后覆盖 native 类

java - 抽象和封装与性能不一致 - 如何?

java - ClassCastException $Proxy 无法转换为使用 aop

java - 更改 eclipse 格式化程序如何包装长字符串

java - 返回字符串而不是在 wicket 中呈现页面

java - 渲染 HTML : Serverside Vs Clientside