2012-07-09 16 views
16

assumere una Regular Expression, che, tramite un oggetto Java Matcher, viene confrontata con un gran numero di stringhe:Java Pattern Matcher: crea nuovo o ripristina?

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

Nel Java SE 6 JavaDoc for Matcher, si trova la possibilità di riutilizzare lo stesso Matcher oggetto, tramite il metodo reset(CharSequence), che, come il codice sorgente mostra, è un po 'meno costoso di creare un nuovo Matcher ogni volta, cioè, a differenza sopra, si potrebbe fare:

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

Qualora una usare il pattern reset(CharSequence) sopra, o dovrebbero preferire inizializzare un nuovo oggetto Matcher ogni volta?

+6

Riutilizzare in tutti i modi il "Matcher". L'unica buona ragione per creare un nuovo 'Matcher' è garantire la sicurezza del thread. Ecco perché non si crea un 'Matcher m statico pubblico --- in effetti, questo è il motivo per cui esiste una classe' Pattern' separata in primo luogo. –

+2

Quindi, per le applicazioni a thread singolo, anche come variabile di istanza o classe, o per quelle a più thread in cui l'oggetto Matcher viene creato all'interno di un metodo, reset() va bene, sì? – PNS

+1

@MarkoTopolnik: Penso che separare la compilazione della regex dalla sua applicazione sia un'altra buona ragione per avere una classe 'Pattern'. –

risposta

24

Riutilizzare in tutti i modi il Matcher. L'unica buona ragione per creare un nuovo Matcher è garantire la sicurezza del thread. Ecco perché non crei uno — infatti, questo è il motivo per cui esiste già un oggetto di fabbrica separato, sicuro per i thread Pattern.

In ogni situazione in cui si è certi che ci sia un solo utente di Matcher in qualsiasi momento, è possibile riutilizzarlo con reset.

Problemi correlati