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
に問題が発生します。
繰り返しになりますが、2 回 null と判断するのはやりすぎです。
最後に、判決の数はビジネス ロジックに基づいています。たとえ 1 か所で判決の数が減ったとしても、他の場所では返済する必要があります。
PHPz2017-04-17 17:59:57
通常のビジネス シナリオでは、term
入力パラメータ が であってはいけないと確信している場合は、そうする必要はありません null
判断する価値があり、合理的ですnull
をできるだけ早く破棄します。 空指针异常
怪我咯2017-04-17 17:59:57
ビジネスロジックを厳密に設計することで空でない判定を減らすことはできますが、コードの保守による歪みは保証できません。そのため、コードの堅牢性を考慮して、使用する前に判定することをお勧めします。散在したコード 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 が返されない場合、方法 1: NPE を直接スローします。方法 2: Optional を使用します (これにより、!=null チェックを忘れることを防ぐことができ、同時にどこよりもエレガントに見えます!=)