एक Regular Expression
मान लें, जो एक जावा Matcher
वस्तु के माध्यम से, तार की एक बड़ी संख्या के खिलाफ मिलान किया जाता है:जावा पैटर्न मैचर: नया बनाएं या रीसेट करें?
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
}
}
Java SE 6 JavaDoc for Matcher में, एक ही Matcher
वस्तु पुन: उपयोग करने का विकल्प मिलता है, reset(CharSequence)
विधि के माध्यम से, जो, के रूप में स्रोत कोड पता चलता है, थोड़ा कम एक नया Matcher
हर बार बनाने, यानी, इसके बाद के संस्करण के विपरीत की तुलना में महंगा है, एक कर सकता है:
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
}
}
एक reset(CharSequence)
पैटर्न का उपयोग करना चाहिए ऊपर, या क्या वे हर बार एक नया Matcher
ऑब्जेक्ट प्रारंभ करना पसंद करते हैं?
हर तरह से 'Matcher' का पुन: उपयोग करें। नया 'Matcher' बनाने का एकमात्र अच्छा कारण थ्रेड-सुरक्षा सुनिश्चित करना है। यही कारण है कि आप वास्तव में 'सार्वजनिक स्थैतिक मचर एम' नहीं बनाते हैं, यही कारण है कि एक अलग 'पैटर्न' वर्ग पहले स्थान पर मौजूद है। –
तो, एकल-थ्रेडेड अनुप्रयोगों के लिए एक इंस्टेंस या क्लास वैरिएबल के रूप में, या मल्टी-थ्रेडेड वाले लोगों के लिए जिसमें मैचर ऑब्जेक्ट को किसी विधि के अंदर बनाया गया है, रीसेट() ठीक है, हां? – PNS
@ मार्कोटोपोलनिक: मुझे लगता है कि रेगेक्स के अनुप्रयोग से इसके संकलन को अलग करना एक 'पैटर्न' वर्ग रखने का एक और अच्छा कारण है। –