2012-07-09 8 views
16

एक 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 ऑब्जेक्ट प्रारंभ करना पसंद करते हैं?

+6

हर तरह से 'Matcher' का पुन: उपयोग करें। नया 'Matcher' बनाने का एकमात्र अच्छा कारण थ्रेड-सुरक्षा सुनिश्चित करना है। यही कारण है कि आप वास्तव में 'सार्वजनिक स्थैतिक मचर एम' नहीं बनाते हैं, यही कारण है कि एक अलग 'पैटर्न' वर्ग पहले स्थान पर मौजूद है। –

+2

तो, एकल-थ्रेडेड अनुप्रयोगों के लिए एक इंस्टेंस या क्लास वैरिएबल के रूप में, या मल्टी-थ्रेडेड वाले लोगों के लिए जिसमें मैचर ऑब्जेक्ट को किसी विधि के अंदर बनाया गया है, रीसेट() ठीक है, हां? – PNS

+1

@ मार्कोटोपोलनिक: मुझे लगता है कि रेगेक्स के अनुप्रयोग से इसके संकलन को अलग करना एक 'पैटर्न' वर्ग रखने का एक और अच्छा कारण है। –

उत्तर

24

सभी माध्यमों से Matcher का पुन: उपयोग करें। नया Matcher बनाने का एकमात्र अच्छा कारण थ्रेड-सुरक्षा सुनिश्चित करना है। यही कारण है कि आप public static Matcher m — वास्तव में नहीं बनाते हैं, यही कारण है कि एक अलग, थ्रेड-सुरक्षित Pattern फैक्ट्री ऑब्जेक्ट पहली जगह मौजूद है।

हर स्थिति में जहां आप सुनिश्चित हैं कि Matcher के किसी भी समय केवल एक उपयोगकर्ता है, तो इसे reset के साथ पुन: उपयोग करना ठीक है।

संबंधित मुद्दे