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?
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. –
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
@MarkoTopolnik: Penso che separare la compilazione della regex dalla sua applicazione sia un'altra buona ragione per avere una classe 'Pattern'. –