NULL文字列と空文字列の違いの理解
Groovyでは、値がnullの変数と値が空の文字列の変数との間に微妙な違いがあります。
値null
はオブジェクトがないことを表し、空の文字列はゼロ文字を含むString
型のオブジェクトです。 2つを比較しようとすると、それらは同じではありません。
たとえば、次の条件付きブロック内のコードは、varA
の値(null)がvarB
の値(空の文字列)と等しくないため、実行されません。
def varA = null
def varB = '' /* The empty string */
if (varA == varB) {
// Do something here when varA equals varB
}
この微妙な違いに関連する別の一般的なgotchaは、変数を空の文字列と比較しようとしてもnull
かどうかがテストされないことです。 たとえば、varA
のnull
値が空の文字列と等しくないため、次の条件付きブロック内のコードが実行(および実行時にNullPointerException
が発生)されます:
def varA = null
if (varA != '') {
// set varB to the first character in varA
def varB = varA.charAt(0)
}
文字列変数がnull
でも空でもないかどうかをテストするには、「できる」は次のような両方の条件を明示的に記述します:
if (varA != null && varA != '') {
// Do something when varA is neither null nor empty
}
ただし、Groovyを使用すると、より単純な方法が提供されます。 null
と空の文字列の両方がブールとして解釈されるとfalse
に評価されるため、かわりに次を使用できます:
if (varA) {
// Do something when varA has a non-null and non-empty value
}
varA
がnull
の場合、条件ブロックはスキップされます。 いずれかの条件がブールfalse
に評価されるため、varA
が空の文字列と等しい場合も同様です。 このよりコンパクトな構文が推奨されるアプローチです。