2012-07-09 18 views
16

asumir una Regular Expression, que, a través de un objeto de Java Matcher, se compara con un gran número de cadenas:Java Pattern Matcher: crear nuevo o reiniciar?

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

En el Java SE 6 JavaDoc for Matcher, se encuentra la opción de volver a utilizar el mismo Matcher objeto, a través del método reset(CharSequence), que, como el código fuente muestra, es un poco menos caro que la creación de un nuevo Matcher cada vez, es decir, a diferencia de antes, se podría hacer:

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

Debe uno utilizar el patrón de reset(CharSequence) arriba, o deberían preferir inicializar un nuevo objeto Matcher cada vez?

+6

Por favor, reutilice el 'Matcher'. La única buena razón para crear un nuevo 'Matcher' es garantizar la seguridad del hilo. Es por eso que no se hace un 'Matcher m' público estático --- de hecho, esa es la razón por la cual existe una clase 'Patrón' separada en primer lugar. –

+2

Por lo tanto, para aplicaciones de subproceso único incluso como una variable de instancia o de clase, o para subprocesos múltiples en los que se crea el objeto Matcher dentro de un método, restablecer() está bien, ¿sí? – PNS

+1

@MarkoTopolnik: Creo que separar la compilación de la expresión regular de su aplicación es otra buena razón para tener una clase 'Pattern'. –

Respuesta

24

Por favor, reutilice el Matcher. La única buena razón para crear un nuevo Matcher es garantizar la seguridad del hilo. Es por eso que no hace un public static Matcher m — de hecho, esa es la razón por la que existe un objeto de fábrica Pattern separado, seguro para subprocesos en primer lugar.

En cualquier situación en la que esté seguro de que solo hay un usuario de Matcher en cualquier momento, puede volver a utilizarlo con reset.

Cuestiones relacionadas