当需要在每个 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
所以我有一个 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