LoginSignup
1

More than 1 year has passed since last update.

posted at

updated at

Organization

StringUtils#containsAnyメソッドの注意

org.apache.commons.lang3.StringUtilsクラスのcontainsAnyはオーバーロードされたいくつかのメソッドがあるが、ハマりやすい挙動があるため注意。

第2引数がCharSequence

public static boolean containsAny(final CharSequence cs, final CharSequence searchChars) 

の方のメソッドは、第2引数の文字列に含まれるいずれかの文字が含まれていた場合にtrueとなる。

// 例
StringUtils.containsAny("abcde", "aaa"); // true

StringUtils.containsAny("abcde", "efghi"); // true

第2引数がCharSequence...

public static boolean containsAny(final CharSequence cs, final CharSequence... searchCharSequences)

の方のメソッドは、第2引数の文字列配列に含まれるいずれかの文字列が含まれていた場合にtrueとなる。(今回は、こちらが想定していた挙動)

// 例
StringUtils.containsAny("abcde", "aaa", "bbb", "ccc"); // false

StringUtils.containsAny("abcde", "cde", "def", "efg"); // true

可変引数のメソッドなのに、引数の数が1のときだけ挙動が変わるメソッド(のように見える)のため、これからバリエーション増えそうだからStringUtils.contains()じゃなくてStringUtils.containsAny()にしとこうという安易な考えでハマらないように注意。

以下のように無理やりキャストすることで、可変引数のメソッドの方を呼び出すようにできる。

StringUtils.containsAny("abcde", new String[]{"aaa"}); // false

StringUtils.containsAny("abcde", new String[]{"efghi"}); // false

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1