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?
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. –
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
@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'. –