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)
выше шаблон reset(CharSequence)
или они предпочитают каждый раз инициализировать новый объект Matcher
?
Ответы
Ответ 1
В любом случае повторно используйте Matcher
. Единственной хорошей причиной для создания нового Matcher
является обеспечение безопасности потоков. Вот почему вы не делаете public static Matcher m
— на самом деле, причина в том, что в первую очередь существует отдельный, потокобезопасный объект Pattern
factory.
В любой ситуации, когда вы уверены, что в любой момент времени у вас есть только один пользователь Matcher
, он может повторно использовать его с помощью reset
.