2012-07-09 19 views
16

Giả sử một Regular Expression, trong đó, thông qua một đối tượng Java Matcher, là lần xuất hiện chống lại một số lượng lớn các dây:Java Pattern Matcher: tạo mới hoặc đặt lại?

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

Trong Java SE 6 JavaDoc for Matcher, người ta tìm thấy các tùy chọn tái sử dụng cùng một đối tượng Matcher, thông qua phương thức reset(CharSequence), trong đó, như mã nguồn cho thấy, là một chút ít tốn kém hơn so với việc tạo ra một mới Matcher mọi thời gian, tức là, không giống như ở trên, người ta có thể làm:

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

một có nên sử dụng mô hình reset(CharSequence) ở trên hoặc họ có muốn khởi tạo đối tượng Matcher mới mỗi lần không?

+6

Bằng mọi cách, hãy sử dụng lại 'Matcher'. Lý do duy nhất để tạo một 'Matcher' mới là đảm bảo an toàn luồng. Đó là lý do tại sao bạn không tạo ra một 'matcher matcher công cộng m' --- thực tế, đó là lý do một lớp' Pattern' riêng biệt tồn tại ngay từ đầu. –

+2

Vì vậy, đối với các ứng dụng đơn luồng ngay cả khi một biến thể hiện hoặc lớp, hoặc cho các biến đa luồng trong đó đối tượng Matcher được tạo bên trong một phương thức, reset() là tốt, phải không? – PNS

+1

@MarkoTopolnik: Tôi nghĩ rằng việc tách biên dịch regex khỏi ứng dụng của nó là một lý do tốt để có một lớp 'Pattern'. –

Trả lời

24

Bằng mọi cách, hãy sử dụng lại Matcher. Lý do duy nhất để tạo mới Matcher là đảm bảo an toàn cho luồng. Đó là lý do tại sao bạn không thực hiện một số public static Matcher m — thực tế, đó là lý do tại sao một đối tượng nhà máy riêng biệt, an toàn chủ đề Pattern tồn tại ở vị trí đầu tiên.

Trong mọi trường hợp bạn chắc chắn chỉ có một người dùng Matcher tại bất kỳ thời điểm nào, bạn có thể sử dụng lại nó với reset.

Các vấn đề liên quan