क्यों निजी स्थिर तरीके हैं?


68

मैं सिर्फ एक सवाल करना चाहता हूं जो मेरे पास है। निजी दृश्यता के साथ एक सामान्य विधि के विपरीत एक निजी स्थिर विधि होने का क्या मतलब है?

मुझे लगता है कि एक स्थिर विधि होने का एक फायदा यह है कि इसे एक वर्ग के उदाहरण के बिना कहा जा सकता है, लेकिन चूंकि इसका निजी होना भी एक बिंदु है, इसलिए यह स्थिर है?

मेरे विचार से एकमात्र कारण यह है कि यह वस्तु स्तर के विपरीत वर्ग स्तर पर विधि को समझने में मदद करता है।


32
हाँ, एक कारण है। आपकी सार्वजनिक / डिफ़ॉल्ट स्थिर विधियाँ अभी भी आपके निजी स्टेटिक्स को कॉल कर सकती हैं। क्या स्थैतिक तरीकों का उपयोग किया जाना चाहिए, और जब किसी भी प्रकार के निजी तरीकों का उपयोग करना उचित हो, तो अलग-अलग प्रश्न हैं, इसलिए सावधान रहें कि उन्हें इस प्रश्न के साथ मिश्रण न करें।

2
त्वरित उदाहरण - अन्य वर्गों द्वारा मंगलाचरण को रोकने के लिए एक आंतरिक वर्ग द्वारा उपयोग की जाने वाली कारखाना विधि (आप वर्ग का एक उदाहरण प्राप्त करने के लिए कारखाने विधि के माध्यम से जाना होगा)।

2
@MattFenwick: आपको इसे उत्तर के रूप में पोस्ट करना चाहिए।
डॉक्टर ब्राउन

9
एक विधि को स्थिर बनाकर, आप यह भी कह रहे हैं कि यह इंस्टेंस वेरिएबल्स को पढ़ना या लिखना नहीं है। एक विधि जो उदाहरण चर के साथ बातचीत नहीं करती है, वह अक्सर स्थानांतरित करने और अन्य स्थानों पर रिफ्लेक्टर करने में आसान होती है।
मार्क रोजर्स

1
यह मत भूलो कि क्या एक स्थिर विधि निजी, आंतरिक या सार्वजनिक है, यह अभी भी आपकी ओर से विशिष्ट कोड सिंक्रनाइज़ेशन प्रयास के बिना थ्रेड-सुरक्षित नहीं है।
क्रेग

जवाबों:


70

स्थिर होने की विशेषता दृश्यता से स्वतंत्र है।

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


3
मुझे लगता है कि आप सही रास्ते पर हैं, लेकिन मुझे भी लगता है कि आपको एक महत्वपूर्ण बिंदु याद आ रहा है। अधिकांश स्थैतिक विधियों में शून्य दुष्प्रभाव होते हैं (वे प्रभावी रूप से कार्य करते हैं, विधियाँ नहीं) - इसीलिए उन्हें पहले स्थान पर स्थैतिक बनाया जाता है। उनके निजी होने का तर्क है "यदि उनके कोई साइड इफेक्ट्स नहीं हैं, तो कोड पुन: उपयोग को बढ़ावा देने के लिए उन्हें सार्वजनिक क्यों न करें"। यह महत्वपूर्ण बिंदु है: जब हम इसे निजी बनाते हैं, तो यह आमतौर पर होता है क्योंकि हम चाहते हैं कि आप पूरी कक्षा का पुन: उपयोग करें जो उस पद्धति का उपयोग करता है, न कि केवल इस पद्धति का।
corsiKa

मुझे कहना होगा कि मैंने ऐसा व्यवहार कभी नहीं किया है। मैंने जो कुछ किया है वह सार्वजनिक स्थैतिक वर्गों के सहायक तरीकों के लिए था।
मियामोतो अकीरा

1
@corsiKa: साइड-इफेक्ट्स समस्या नहीं हैं। एक गैर-निजी वर्ग के एक स्थिर सदस्य को प्रभावी ढंग से वादा करता है कि एक वर्ग के प्रत्येक भविष्य के संस्करण में उसी नाम का वही तरीका शामिल होगा जो समान कार्य करता है। यदि परिवर्तन की आवश्यकता है, और कक्षा के भविष्य के संस्करण के लिए उस पद्धति की कोई आवश्यकता नहीं हो सकती है जो ठीक उसी तरह से काम करती है जैसे कि वर्तमान में करता है, तो एक निजी पद्धति को सुरक्षित रूप से एक के साथ प्रतिस्थापित किया जा सकता है जो कक्षा की नई जरूरतों को पूरा करता है। एक साधारण उदाहरण के रूप में, लगता है एक वर्ग एक तरीका है जिसके एक स्ट्रिंग लेता है और जैसे प्रतिस्थापन प्रदर्शन की जरूरत <के लिए &lt;जब यह लिखा है आदि, ...
supercat

1
... तार जो यह नहीं जाना जाता है पारित हो जाता है किसी भी ऐम्परसेंड को रोकने के लिए, और यह इस प्रकार परिवर्तित नहीं करता है &के लिए &amp;[मैं कोड लिख रहे थे, मैं परिवर्तित होता &करने के लिए &amp;भले ही मैं यह आवश्यक हो, लेकिन लगता है कि उम्मीद नहीं थी कि यह नहीं है]। यह बाद में इसे ऐम्परसेंड को संभालने के लिए आवश्यक हो जाता है, लेकिन विधि सार्वजनिक है, यह विस्तार करने के लिए बदल रहा है &करने के लिए &amp;बाहर कोड जो अपनी ही प्रदर्शन को तोड़ सकते थे &-to- &amp;प्रतिस्थापन। यदि विधि निजी है, हालांकि, इसे &किसी भी बाहरी कोड के लिए समस्या पैदा किए बिना संभालने के लिए तय किया जा सकता है ।
सुपरकैट

यही कारण है कि कम से कम कहने के लिए एक दिलचस्प समस्या है, लेकिन मैं नहीं दिख रहा है कि कैसे बनाता है यह स्थिर किया जा रहा है यह किसी भी अधिक स्थिर नहीं किया जा रहा से एक समस्या है, जो इस मुद्दे के लिए महत्वपूर्ण है की। यदि हम आपके तर्क का पालन करते हैं, तो हर जगह सब कुछ सब कुछ फिर से लागू होगा क्योंकि "ओग, अगर किसी बग या आवश्यकताएं किसी दिन बदलती हैं तो क्या होगा?"
corsiKa

26

एक सामान्य रूप से सामान्य कारण (जावा में) कंस्ट्रक्टर में अपरिवर्तनीय फील्ड वेरिएबल्स को इनिशियलाइज़ private staticकरने के लिए होगा ताकि कंस्ट्रक्टर क्लटर को कम करने के लिए एक सरल विधि का उपयोग किया जा सके।

  • यह है private: बाहरी वर्गों को इसे नहीं देखना चाहिए।
  • यह है static: यह कुछ ऑपरेशन कर सकता है, मेजबान वर्ग के राज्य के स्वतंत्र 1

कुछ हद तक एक विपरीत उदाहरण ...

उदाहरण के लिए:

public class MyClass{
    private final String concatenated;

    public MyClass(String a, String b){
        concatenated = concat(a,b);
    }

    public String getConcatenated(){
       return concatenated;
    }

    /**
    *  Concatenates two Strings as `s1---s2`
    **/
    private static final String concat(String s1, String s2){
        return String.format("%s---%s", s1, s2);
    }
}

1 यह मानते हुए कि अन्य staticचर के साथ इसकी कोई बातचीत नहीं है ।


15
यह तब और भी अधिक मूल्यवान है जब आपको सुपरक्लास के कंस्ट्रक्टर के लिए व्युत्पन्न (गणना) तर्कों को पारित करने की आवश्यकता होती है। super(...)कॉल अपने वर्ग 'निर्माता की पहली पंक्ति में होना चाहिए, ताकि आप आप बाहर काम क्या सुपर कॉल करने के लिए पारित करने के लिए मदद करने के लिए स्थानीय चर की घोषणा नहीं कर सकते हैं। हालांकि, आप (निजी) स्थिर तरीकों को कॉल कर सकते हैं , जो सुपर कंस्ट्रक्टर को पास करने के लिए मूल्य को वर्कआउट करने के लिए आवश्यक के रूप में कई लाइनों का उपयोग करते हैं।
आंद्रेज डोयले

ध्यान दें कि एक स्थिर इनिशियलाइज़र ब्लॉक की संभावना है
फ्रांज एबनर

13

एक private staticविधि के लिए एक सामान्य उपयोग-मामला एक उपयोगिता विधि है जो है

  1. केवल उस एक वर्ग द्वारा उपयोग किया जाता है
  2. उस वर्ग की आंतरिक स्थिति से स्वतंत्र है

12

आप देखते हैं कि आपके पास कोड की कुछ पंक्तियाँ हैं जो आपके बहुत से तरीकों में दोहराई जाती हैं, इसलिए आप उन्हें एकल विधि में निकालने का निर्णय लेते हैं, क्योंकि डुप्लिकेट कोड अच्छा नहीं है।

आप विधि को निजी बनाते हैं क्योंकि यह व्यापक उपयोग के लिए डिज़ाइन नहीं किया गया है और आप असंबंधित कोड को कॉल नहीं करना चाहते हैं। (टिप्पणियों में इस बिंदु पर बहस करें ...)

चूंकि विधि किसी भी उदाहरण फ़ील्ड तक नहीं पहुंचती है, इसे स्थिर बनाया जा सकता है, इसे स्थिर बनाने से आपको समझना आसान हो जाता है और शायद थोड़ा तेज़ भी हो सकता है।

फिर .... (शायद अब, शायद बाद में, शायद कभी नहीं)

एक बार विधि को स्थिर बना देने के बाद, यह स्पष्ट है कि इसे कक्षा से बाहर ले जाया जा सकता है, एक एकता वर्ग से कहें।

इसे अपने मापदंडों में से एक की आवृत्ति विधि में बदलना भी आसान है, अक्सर यह वह जगह है जहां कोड होना चाहिए।


मुझे यह उत्तर पसंद है, लेकिन क्या आपके पास इसके लिए कोई संदर्भ है? "और शायद थोड़ा तेज़ भी"
मैगनीलेक्स

@Magnilex, "इस" पॉइंटर को स्थिर क्लास मेथड में पास नहीं किया जाता है, इसलिए वे तब तेजी से स्थिर हो जाते हैं, जब तक कंपाइलर पता नहीं लगाता है कि "इस" का प्रयोग इंस्टेंस मेथड (अप्रभावित) में नहीं किया गया है।
इयान

2

मैं कम से कम दो कारणों के बारे में सोच सकता हूं कि आपको कक्षा पर एक स्थिर निजी पद्धति की आवश्यकता क्यों होगी।

1: आपके उदाहरणों के पास एक स्थिर विधि को कॉल करने का कारण है जिसे आप सीधे नहीं चाहते हैं, शायद इसलिए कि यह आपकी कक्षा के सभी उदाहरणों के बीच डेटा साझा करता है।

2: आपके सार्वजनिक स्थैतिक तरीकों में सबरूटीन होते हैं जिन्हें आप सीधे नहीं कहते हैं। विधि को अभी भी उदाहरण के बिना कहा जाता है, बस सीधे नहीं।

बेशक, "यह कक्षा को समझ बनाने में मदद करता है" यह अपने आप में एक अच्छा कारण है।


1

आम तौर पर, अगर मुझे लगता है कि मैं निजी स्थिर तरीके लिख रहा हूं, तो मैं इसे एक संकेत के रूप में लेता हूं कि कुछ ऐसा है जिसे मुझे अलग से मॉडलिंग करना चाहिए।

चूंकि वे एक विशेष वस्तु उदाहरण की स्थिति से बंधे नहीं हैं, इसलिए सार्वजनिक और निजी स्थिर तरीकों का एक संग्रह अपने स्वयं के शब्दार्थ और गैर-स्थिर तरीकों के साथ एक पूरी तरह से अलग वर्ग बना सकता है।

(एक अन्य टिप-ऑफ है अगर मुझे लगता है कि मेरे पास बहुत सारे स्टैटिक तरीके हैं (सार्वजनिक और निजी) जो सभी में किसी न किसी प्रकार का एक सामान्य पैरामीटर है, तो वे उस प्रकार के सदस्यों के रूप में बेहतर हो सकते हैं।)

इसलिए, आपके प्रश्न का उत्तर देने के लिए, निजी स्थिर विधियाँ तब दिखाई देती हैं जब कोई वर्ग संबंधित विधियों का एक समूह प्रदान करता है जो उस वर्ग के उदाहरण से स्वतंत्र होते हैं। (... और चूंकि वे स्वतंत्र हैं, वे अपनी कक्षा में बेहतर हो सकते हैं।)


-1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.