जावा रेगेक्स पैटर्न - समय की कमी या उदाहरण के सदस्यों का संकलन?


13

वर्तमान में, मेरे पास कुछ सिंगलटन ऑब्जेक्ट्स हैं, जहाँ मैं नियमित अभिव्यक्तियों से मेल खा रहा हूँ, और मेरे Patternएस को इस तरह परिभाषित किया गया है:

class Foobar {
  private final Pattern firstPattern =
    Pattern.compile("some regex");
  private final Pattern secondPattern =
    Pattern.compile("some other regex");
  // more Patterns, etc.
  private Foobar() {}
  public static Foobar create() { /* singleton stuff */ }
}

लेकिन मुझे किसी दूसरे दिन कहा गया कि यह खराब शैली है, और हमेशा वर्ग स्तर पर परिभाषित किया Patternजाना चाहिए , और इसके बजाय कुछ देखना चाहिए:

class Foobar {
  private static final Pattern FIRST_PATTERN =
    Pattern.compile("some regex");
  private static final Pattern SECOND_PATTERN =
    Pattern.compile("some other regex");
  // more Patterns, etc.
  private Foobar() {}
  public static Foobar create() { /* singleton stuff */ }
}

इस विशेष वस्तु का जीवनकाल इतना लंबा नहीं है, और पहला दृष्टिकोण का उपयोग करने का मेरा मुख्य कारण यह है कि यह मेरे लिए समझ में नहीं आता है कि Patternएक बार ऑब्जेक्ट को GC'd मिल जाता है।

कोई सुझाव / विचार?

जवाबों:


18

जावा पैटर्न ऑब्जेक्ट थ्रेड सुरक्षित और अपरिवर्तनीय हैं (इसके मिलानकर्ता जो थ्रेड सुरक्षित नहीं हैं)।

इस प्रकार, उन्हें बनाने का कोई कारण नहीं है staticयदि वे कक्षा के प्रत्येक उदाहरण द्वारा उपयोग किए जा रहे हैं (या फिर कक्षा में किसी अन्य विधि से)।

उदाहरण के लिए उन्हें चर बनाना, चाहे उनका जीवनकाल कितना भी छोटा (या लंबा) क्यों न हो, इसका मतलब है कि जब भी आप कक्षा का एक उदाहरण बनाते हैं, तो आप नियमित अभिव्यक्ति को पुनः प्राप्त कर रहे होते हैं।

इस संरचना के लिए प्रमुख कारणों में से एक (पैटर्न मिलान वस्तुओं के लिए एक कारखाना है) यह है कि नियमित अभिव्यक्ति को अपने परिमित ऑटोमेटा में संकलित करना एक मामूली महंगी कार्रवाई है। हालांकि, कोई यह पाता है कि अक्सर एक ही कक्षा में एक ही नियमित अभिव्यक्ति का उपयोग बार-बार किया जाता है (या तो एक ही विधि के कई चालान के माध्यम से या कक्षा में अलग-अलग स्पॉट)।

दूसरी ओर, मिलानकर्ता, बल्कि हल्का है - यह पैटर्न के भीतर पैटर्न की स्थिति और स्ट्रिंग के लिए वर्ण सरणी के भीतर स्थान को इंगित करता है।


एक सिंगलटन के लिए , यह बहुत ज्यादा मायने नहीं रखना चाहिए , क्योंकि आखिरकार, इसका एक ही उदाहरण है जो चारों ओर बैठता है और आप बार-बार सिंगलटन को फिर से नहीं बना रहे हैं (प्रतीक्षा करें, 'सिंगलटन का जीवनकाल इतना लंबा नहीं है' ? क्या इसका मतलब है कि आप इसे आवेदन के दौरान कई बार झटपट कर रहे हैं ? "

हालाँकि, आप पाएंगे कि कुछ स्थैतिक स्रोत कोड एनालाइज़र यह नहीं पहचानते हैं कि कुछ एक सिंगलटन है और यह शिकायत करेगा कि आप कक्षा के प्रत्येक उदाहरण के लिए स्थिरांक से पैटर्न बना रहे हैं।

इस सब के साथ समस्या यह है कि यह एक अच्छा नहीं है (इसकी सिंगलटन के लिए बुरा नहीं है) विकल्प। और आप उन चीजों के लिए अन्य चेतावनियों को नजरअंदाज करना शुरू कर सकते हैं जो कंपाइलर और विश्लेषण उपकरण आपको बताते हैं ( टूटी खिड़कियों के बारे में और पढ़ें )।

सम्बंधित:


बहुत बढ़िया जवाब - हाँ, मेरा मतलब है कि यह केवल एक बार बनाया / उपयोग किया जाता है, और एक बार यह गुंजाइश से बाहर हो जाता है, यह अच्छे के लिए किया जाता है। पढ़ने के लिए धन्यवाद!
यामाफोंटेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.