Java Pattern Matcher: créer nouveau ou réinitialiser?


Supposons un Regular Expression, qui, via un objet Java Matcher, est mis en correspondance avec un grand nombre de chaînes:

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
    }
}

Dans le Java SE 6 JavaDoc pour Matcher, on trouve la possibilité de réutiliser le même Matcher objet, via la méthode reset(CharSequence), qui, comme le montre le code source, est un peu moins cher que de créer un nouveau Matcher à chaque fois, c'est-à-dire, contrairement à ce qui précède, on pourrait faire:

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
    }
}

Faut-il utiliser le modèle reset(CharSequence) ci-dessus, ou devraient-ils préférer initialiser un nouvel objet Matcher chaque de temps?

Author: Anthony Johnston, 2012-07-09

1 answers

Par tous les moyens réutiliser le Matcher. La seule bonne raison de créer un nouveau Matcher est d'assurer la sécurité des threads. C'est pourquoi vous ne faites pas un public static Matcher m-en fait, c'est la raison pour laquelle un objet factory Pattern séparé et sans thread existe en premier lieu.

Dans chaque situation où vous êtes sûr qu'il n'y a qu'un seul utilisateur de Matcher à tout moment, il est correct de le réutiliser avec reset.

 25
Author: Marko Topolnik, 2012-07-09 09:21:26