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.