public static void main(String[] args) {
String result = replaceStr("jaja");
if (result != null) { //在这里又要判断下非空
int count = 50 + Integer.parseInt(result);
}
}
public static String replaceStr(String tem){
String result;
if (tem == null) {
result = null;
} else {
String substring = tem.substring(0, 1);
result = substring;
}
return result;
}
如上代码,我的疑惑时,当参数tem为空,方法返回null,那岂不是又要在调用
replaceStr
这个方法的地方又要判断次返回值是否为null?那这个代码看上去不是很难看,好多if(**!=null)这样的语句。我想问的是:有没有一种设计,可以只要在一处判断非空,其他地方只要写业务逻辑就行了?
黄舟2017-04-17 17:59:57
우선 코드가 잘못되었습니다
으아아아 if (tem == null)
이어야 합니다.
둘째, 이렇게 변경해도 여전히 엄격하지 않습니다. tem=""
이면 else
에 문제가 발생합니다.
다시 한번 말씀드리지만 null로 두 번 판단하기에는 무리가 있습니다.
마지막으로 판단 횟수는 비즈니스 논리에 따라 결정됩니다. 한 곳에서 판단 횟수가 줄어들더라도 여전히 다른 곳에서 상환해야 합니다.
大家讲道理2017-04-17 17:59:57
메서드의 반환 값으로 null을 사용하지 않으면 null을 감지할 필요가 없습니다. 예를 들어 예제에서는 "0"만 반환하면 됩니다.
PHPz2017-04-17 17:59:57
term
입력 매개변수 가 해야 하고 null
일 수 없다고 확신한다면 일반적인 비즈니스 시나리오에서는 그렇게 할 필요가 없습니다. null
판단할 가치가 있으며 이는 가능한 한 빨리 空指针异常
을 폐기하는 것이 합리적입니다.
怪我咯2017-04-17 17:59:57
비즈니스 로직의 엄격한 설계를 통해 null이 아닌 판단을 줄일 수는 있지만 코드 유지로 인한 왜곡은 여전히 보장할 수 없으므로 코드의 견고성을 위해 먼저 판단한 후 사용하는 것이 좋습니다. 흩어져 있는 코드 str == null || "".equals(str)
가 보기 흉해 보인다면 자체 패키징 도구를 사용하거나 Apache의 StringUtils 등과 같은 오픈 소스 도구를 사용할 수 있습니다.
PHPz2017-04-17 17:59:57
코드 변경:
으아아아먼저 Null이 아닌 것으로 판단해야 하는 비즈니스 요구 사항은 불가피하거나 설계 시 기본값을 추가하고 반환 값이 Null인 경우 기본값을 사용할 수 있습니다(구체적인 상황은 Null이 발생하는 비즈니스에 따라 다름). 값, 다음에 수행할 작업, 기본값 사용, 예외 발생, 실행 종료 등).
기본값 사용에 대해서는 Guava의 MoreObjects#firstNonNull을 참조하세요.
java8의 선택 사항은 이 null 판단 문제를 해결하는 것입니다(사실 판단은 여전히 피할 수 없지만 NullPointerException을 피하는 다른 방법일 뿐입니다). 살펴볼 수도 있습니다.
추가로 직접 Ctrl+C Spring의 StringUtils#replace 메소드를 제공합니다(같은 이유로 Apache Common의 StringUtils를 참조할 수도 있습니다. 어쨌든 Java 세계에서는 StringUtils가 부족하지 않습니다). 다른 사람들이 어떻게 구현하는지 참조하세요.
으아아아天蓬老师2017-04-17 17:59:57
개인적 접근 방식:
null 반환이 필요한 경우가 아니면 null 값을 반환하지 마세요. null 값을 전달하지 마세요. ["Clean Code"에도 이렇게 나와 있습니다.]
null이 반환되지 않으면 방법 1: NPE를 직접 던집니다. 방법 2: Optional을 사용합니다(이렇게 하면 !=null 검사를 잊어버리지 않고 모든 곳보다 더 우아해 보입니다!=).