当需要在每个 setter 中使用相同的条件运算符时如何保持干燥?

How to be DRY when need to have same conditional operator in every setter?

所以我有一个 class 字段不能有特定值。我在每个 setter 中都设置了一个条件,但我不确定这是个好主意,因为这是相同的 "if",每个 setter 中的条件相同。这里的例子 setter (java):

public void setBuildingNumber(String buildingNumber) {
    if (buildingNumber.equals("-1") || buildingNumber.equals("0") || buildingNumber.equals("N/A")) {
        this.buildingNumber = null;
    } else {
        this.buildingNumber = buildingNumber;
    }
}

为该逻辑编写一个静态方法:

public static boolean isEmpty (String input) {
    return input == null || input.equals("-1") || input.equals("0") || input.equals("N/A");
}

并在每个 setter:

中使用它
public void setBuildingNumber(String buildingNumber) {
    this.buildingNumber = isEmpty(buildingNumber) ? null : buildingNumber;
}

您可以只创建一个验证方法,如果失败则 returns 默认值,即

private static String getValidValue(String candidate) {
    return (candidate.equals("-1") || candidate.equals("0") || candidate.equals("N/A") ? null : candidate;
}

这将使您的 setter

public void setBuildingNumber(String buildnumber) {
    this.buildnumber = getValidValue(buildnumber);
}

到目前为止,这与其他答案几乎相同。

如果有效值不同,您可以创建验证工厂方法。

private static <T> Function<T,T> createValidator(Predicate<T> valid, T defValue) {
    return s -> valid.test(s) ? s : defValue;
}

然后像这样组合你的验证器

static Function<String, String> getValidBuildingNumber = createValidator(
    s -> !"0".equals(s) && !"1".equals(s) && !"N/A".equals(s), null);

像这样在您的 setter 中使用:

public void setBuildingNumber(String buildingnumber) {
    this.buildingnumber = getValidBuildingNumber.apply(buildingnumber);
}

嗯,既然他们已经给出了解决方案,我只是想提醒你,你最好更换

buildingNumber.equals("-1")

"-1".equals(buildingNumber)

以防它为 null