2012-07-09 4 views
16

Angenommen, ein Regular Expression, die über ein Matcher Objekt Java, gegen eine große Anzahl von Saiten abgestimmt ist:Java Pattern Matcher: neu erstellen oder zurücksetzen?

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

Im Java SE 6 JavaDoc for Matcher findet man die Möglichkeit, das gleiche Matcher Objekt Wiederverwendung über die reset(CharSequence) Methode, die, wie der Quellcode zeigt, ist ein bisschen weniger teuer als eine neue Matcher jedes Mal zu schaffen, das heißt, im Gegensatz zu oben, könnte man tun:

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

man das reset(CharSequence) Muster verwenden sollten ob oder ob sie es vorziehen, jedes Mal ein neues Matcher Objekt zu initialisieren?

+6

Verwenden Sie auf alle Fälle den 'Matcher'. Der einzige gute Grund, einen neuen "Matcher" zu erstellen, ist die Gewährleistung der Sicherheit. Das ist der Grund, warum du keinen "statischen statischen Matcher m" machst - in der Tat, das ist der Grund, warum eine separate "Pattern" -Klasse überhaupt existiert. –

+2

Also, für Singlethread-Anwendungen sogar als Instanz oder Klassenvariable, oder für Multithreaded-Anwendungen, in denen das Matcher-Objekt innerhalb einer Methode erstellt wird, ist reset() in Ordnung, ja? – PNS

+1

@MarkoTopolnik: Ich denke, die Compilierung der Regex von der Anwendung zu trennen ist ein weiterer guter Grund, eine 'Pattern'-Klasse zu haben. –

Antwort

24

Verwenden Sie auf alle Fälle die Matcher. Der einzige gute Grund, einen neuen Matcher zu erstellen, ist die Gewährleistung der Fadensicherheit. Deshalb machen Sie keinen public static Matcher m — in der Tat, das ist der Grund, warum ein getrenntes, thread-sicheres Pattern Fabrikobjekt in erster Linie existiert.

In jeder Situation, in der Sie sicher sind, dass es zu irgendeinem Zeitpunkt nur einen Benutzer von Matcher gibt, ist es in Ordnung, ihn mit reset wiederzuverwenden.