如何使用构建器处理异常

时间:2015-07-02 21:56:13

标签: java

我有一个类的构建器,其中包含使用Google libphonenumber库的以下方法。

public final Builder withPhoneNumber(String phoneNumber, String region)
            throws NumberParseException,IllegalArgumentException {

    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();

    if (!phoneUtil.getSupportedRegions().contains(region)) {
        throw new IllegalArgumentException("Region code is invalid.");
    }

    PhoneNumber inputNumber = phoneUtil.parse(phoneNumber, region);
    String formattedNumber = phoneUtil.format(inputNumber, PhoneNumberFormat.E164);

    this.phoneNumbers.add(formatterNumber);

    return this;
}

该方法需要检查phoneNumber参数是否为有效形式,并且region参数是允许区域之一。通常,如果这只是类的mutator方法而不是构建器,我只是在内部处理异常并返回false如果发生,但由于我只能返回Builder类型,我不能返回boolean。如上所述将异常传播给用户会更好(要求用户使用try catch块包围其构建器调用),还是应该通过返回未更改的构建器来内部管理异常(即拒绝新的电话号码)如果它无效)?我唯一关心的第二个选项是没有通知用户为什么方法调用没有将电话号码添加到构建器,但我想我可以把它放在javadoc中。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您发布的代码段对我来说似乎是正确的方法。我不认为你有任何理由担心,因为:

  1. IllegalArgumentException 已检查例外,因此您不会强制客户端围绕try / catch块中的构建代码。
  2. 通常应该在开始构建域对象之前验证输入。验证逻辑应该保护UI输入,并且在输入数据有效之前不允许任何事务开始。
  3. 第二个项目符号表示您在构建器中只执行一次双重检查,而不是实际验证,这会导致UI中出现错误消息。

    您可以这样思考:如果输入为nullphoneNumberregion),该怎么办?最有可能的是,这将导致NullPointerException,这是正确的行为。而且你不希望客户{NPE} {};他们不应该用这种输入来调用你的方法。