どちらかまたは両方がnull
.
.equals()
したがって、値を含めることができるため、単純に呼び出すことはできませんnull
。
私がこれまでに試したコード:
boolean compare(String str1, String str2) {
return ((str1 == str2) || (str1 != null && str1.equals(str2)));
}
を含むすべての可能な値をチェックする最良の方法は何null
ですか?
どちらかまたは両方がnull
.
.equals()
したがって、値を含めることができるため、単純に呼び出すことはできませんnull
。
私がこれまでに試したコード:
boolean compare(String str1, String str2) {
return ((str1 == str2) || (str1 != null && str1.equals(str2)));
}
を含むすべての可能な値をチェックする最良の方法は何null
ですか?
Java 7 以降では、 static メソッドを使用してjava.util.Objects.equals(Object, Object)
、2 つのオブジェクトが .xml であることを気にせずに等しいチェックを実行できますnull
。
両方のオブジェクトが存在する場合null
は を返しtrue
、一方が存在null
し、もう一方が存在しない場合は を返しfalse
ます。equals
それ以外の場合は、2 番目のオブジェクトを引数として最初のオブジェクトを呼び出した結果が返されます。
これは、Java 内部コードが (他のcompare
メソッドで)使用するものです。
public static boolean compare(String str1, String str2) {
return (str1 == null ? str2 == null : str1.equals(str2));
}
これらのケースでは、Apache Commons StringUtils#equalsを使用する方がよいでしょう。これはすでに null 文字列を処理しています。コードサンプル:
public boolean compare(String s1, String s2) {
return StringUtils.equals(s1, s2);
}
ライブラリを追加したくない場合は、メソッドのソース コードStringUtils#equals
をコピーして、必要なときに適用してください。
バージョン 3.5 以降、Apache Commons StringUtils には次のメソッドがあります。
static int compare(String str1, String str2)
static int compare(String str1, String str2, boolean nullIsLess)
static int compareIgnoreCase(String str1, String str2)
static int compareIgnoreCase(String str1, String str2, boolean nullIsLess)
これらは、null 安全な文字列比較を提供します。
Apache Commons StringUtils クラスの equals(-,-) および equalsIgnoreCase(-,-) メソッドを使用して、2 つの文字列を比較します。
StringUtils.equals(-, -) :
StringUtils.equals(null, null) = true
StringUtils.equals(null, "abc") = false
StringUtils.equals("abc", null) = false
StringUtils.equals("abc", "abc") = true
StringUtils.equals("abc", "ABC") = false
StringUtils.equalsIgnoreCase(-, -) :
StringUtils.equalsIgnoreCase(null, null) = true
StringUtils.equalsIgnoreCase(null, "abc") = false
StringUtils.equalsIgnoreCase("xyz", null) = false
StringUtils.equalsIgnoreCase("xyz", "xyz") = true
StringUtils.equalsIgnoreCase("xyz", "XYZ") = true
以下のように使え java.util.Objects
ます。
public static boolean compare(String str1, String str2) {
return Objects.equals(str1, str2);
}
boolean compare(String str1, String str2) {
if(str1==null || str2==null) {
//return false; if you assume null not equal to null
return str1==str2;
}
return str1.equals(str2);
}
これはあなたが望んだものですか?
では、「可能な限り最善の解決策」とはどういう意味ですか?
最も読みやすいという意味であれば、考えられるすべての解決策は、経験豊富な Java プログラマーにとってほぼ同等です。しかし、IMOで最も読みやすいのはこれです
public boolean compareStringsOrNulls(String str1, String str2) {
// Implement it how you like
}
つまり、(理想的には) インライン化できる単純なメソッド内に実装を隠します。
(サードパーティのユーティリティ ライブラリに「アウトソース」することもできます...コードベースで既に使用している場合。)
最もパフォーマンスが高いという意味であれば、次のようになります。
null
「コンテキスト」の問題の 1 つは、引数の相対的な (動的な) 発生頻度です。boolean compare(String str1, String str2) {
if (str1 == null || str2 == null)
return str1 == str2;
return str1.equals(str2);
}
boolean compare(String str1, String str2) {
return (str1==null || str2==null) ? str1 == str2 : str1.equals(str2);
}