26

Regular ExpressionJavaMatcherオブジェクトを介して多数の文字列と照合される を想定します。

String expression = ...; // The Regular Expression
Pattern pattern = Pattern.compile(expression);
String[] ALL_INPUT = ...; // The large number of strings to be matched

Matcher matcher; // Declare but not initialize a Matcher

for (String input:ALL_INPUT)
{
    matcher = pattern.matcher(input); // Create a new Matcher

    if (matcher.matches()) // Or whatever other matcher check
    {
         // Whatever processing
    }
}

Java SE 6 JavaDoc for Matcherでは、メソッドMatcherを介して同じオブジェクトを再利用するオプションが見つかります。これは、ソース コードが示すように、毎回reset(CharSequence)新しいオブジェクトを作成するよりも少しコストがかかりません。つまり、上記とは異なり、Matcher行う:

String expression = ...; // The Regular Expression
Pattern pattern = Pattern.compile(expression);
String[] ALL_INPUT = ...; // The large number of strings to be matched

Matcher matcher = pattern.matcher(""); // Declare and initialize a matcher

for (String input:ALL_INPUT)
{
    matcher.reset(input); // Reuse the same matcher

    if (matcher.matches()) // Or whatever other matcher check
    {
         // Whatever processing
    }
}

reset(CharSequence)上記のパターンを使用する必要がありますか、それともMatcher毎回新しいオブジェクトを初期化することを好む必要がありますか?

4

1 に答える 1

35

ぜひ再利用してMatcherください。新しいものを作成する唯一の正当な理由Matcherは、スレッドセーフを確保することです。これが、作成しない理由です。public static Matcher m実際、これが、スレッドセーフな別個のPatternファクトリオブジェクトがそもそも存在する理由です。

Matcherある時点でのユーザーが1人だけであることが確実なすべての状況で、それをで再利用することは問題ありませんreset

于 2012-07-09T09:21:26.933 に答える