Java Pattern Matcher: создать новый или reset?

Предположим, что Regular Expression, который через объект Java Matcher сопоставляется с большим количеством строк:

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 для 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?

1 ответ

В любом случае повторно используйте Matcher. Единственной хорошей причиной для создания нового Matcher является обеспечение безопасности потоков. Вот почему вы не делаете public static Matcher m — на самом деле, причина в том, что в первую очередь существует отдельный, потокобезопасный объект Pattern factory.

В любой ситуации, когда вы уверены, что в любой момент времени у вас есть только один пользователь Matcher, он может повторно использовать его с помощью reset.

licensed under cc by-sa 3.0 with attribution.