यदि वे स्थिर हो सकते हैं तो निजी सहायक विधियों को स्थिर होना चाहिए


205

मान लीजिए कि मेरे पास एक वर्ग है जिसे तत्काल तैयार किया गया है। मेरे पास कक्षा के अंदर कई निजी "सहायक" विधियाँ हैं, जिन्हें कक्षा के किसी भी सदस्य तक पहुँचने की आवश्यकता नहीं है, और केवल उनके तर्कों पर काम करते हैं, जिसके परिणामस्वरूप परिणाम लौटते हैं।

public class Example {
   private Something member;

   public double compute() {
       double total = 0;
       total += computeOne(member);
       total += computeMore(member);
       return total;         
   }

   private double computeOne(Something arg) { ... }
   private double computeMore(Something arg) {... } 
} 

क्या निर्दिष्ट करने के लिए computeOneऔर computeMoreस्थिर तरीकों के रूप में कोई विशेष कारण है - या किसी विशेष कारण से नहीं?

उन्हें गैर-स्थिर के रूप में छोड़ना निश्चित रूप से आसान है, भले ही वे बिना किसी समस्या के निश्चित रूप से स्थिर हो सकते हैं।


3
जावा में कीवर्ड स्थैतिक का उपयोग न करने पर भी देखें: stackoverflow.com/questions/1766715/…
मार्क बटलर

जवाबों:


174

मैं ऐसे सहायक तरीकों को प्राथमिकता देता हूं private static; जो पाठक को यह स्पष्ट कर देगा कि वे वस्तु की स्थिति को संशोधित नहीं करेंगे। मेरी आईडीई इटैलिक में स्थिर तरीकों से कॉल दिखाएगी, इसलिए मुझे पता होगा कि हस्ताक्षर को देखे बिना विधि स्थिर है।


2
मेरे पसंदीदा थ्रेड्स में से एक है। मैं नेटबीन का उपयोग कर रहा हूं और यह इटैलिक फोंट के साथ स्थिर विधि कॉल को दर्शाता है।
स्कीबॉक्स

2
मैं आम तौर पर उन सहायक विधियों की घोषणा protected staticकरता हूं जो उन्हें एक ही पैकेज में एक परीक्षण वर्ग में बहुत आसानी से परीक्षण योग्य बनाता है।
जेम्स

2
@ नाम या बस static(यदि हम इसे परीक्षण के लिए चाहते हैं)।
mrod

3
"वस्तु की स्थिति को संशोधित नहीं करेगा" - एक निजी विधि से इसे अलग करने के तरीके की स्पष्ट व्याख्या।
आशा है कि जुंग

110

इसका परिणाम थोड़ा छोटा बायटेकोड हो सकता है, क्योंकि स्थैतिक विधियों तक पहुंच नहीं होगी this। मुझे नहीं लगता कि इससे गति में कोई फर्क पड़ता है (और अगर ऐसा किया जाता है, तो शायद यह बहुत छोटा होगा) कुल मिलाकर अंतर बनाने के लिए।

मैं उन्हें स्थिर कर दूंगा, क्योंकि मैं आम तौर पर ऐसा करता हूं यदि संभव हो तो। लेकिन वह सिर्फ मैं हूं।


EDIT: यह उत्तर नीचे की ओर जाता रहता है, संभवतः क्योंकि बायोटेक आकार के बारे में असंबद्ध जोर देने के कारण। इसलिए मैं वास्तव में एक परीक्षण चलाऊंगा।

class TestBytecodeSize {
    private void doSomething(int arg) { }
    private static void doSomethingStatic(int arg) { }
    public static void main(String[] args) {
        // do it twice both ways
        doSomethingStatic(0);
        doSomethingStatic(0);
        TestBytecodeSize t = new TestBytecodeSize();
        t.doSomething(0);
        t.doSomething(0);
    }
}

बाइटकोड (साथ पुनर्प्राप्त javap -c -private TestBytecodeSize):

Compiled from "TestBytecodeSize.java"
class TestBytecodeSize extends java.lang.Object{
TestBytecodeSize();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

private void doSomething(int);
  Code:
   0:   return

private static void doSomethingStatic(int);
  Code:
   0:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_0
   1:   invokestatic    #2; //Method doSomethingStatic:(I)V
   4:   iconst_0
   5:   invokestatic    #2; //Method doSomethingStatic:(I)V
   8:   new     #3; //class TestBytecodeSize
   11:  dup
   12:  invokespecial   #4; //Method "<init>":()V
   15:  astore_1
   16:  aload_1
   17:  iconst_0
   18:  invokespecial   #5; //Method doSomething:(I)V
   21:  aload_1
   22:  iconst_0
   23:  invokespecial   #5; //Method doSomething:(I)V
   26:  return

}

स्थैतिक विधि को लागू करने के लिए दो बायटेकोड्स (byteops?) लगते हैं: iconst_0(तर्क के लिए) और invokestatic
गैर-स्थैतिक विधि को लागू करने में तीन लगते हैं: aload_1( TestBytecodeSizeऑब्जेक्ट के लिए, मुझे लगता है), iconst_0(तर्क के लिए), और invokespecial। (ध्यान दें कि यदि ये निजी तरीके नहीं थे, तो यह invokevirtualइसके बजाय होता invokespecial, JLS if7.7 इनवॉइसिंग तरीके देखें ।)

अब, जैसा कि मैंने कहा, मुझे उम्मीद नहीं है कि इन दोनों के बीच प्रदर्शन में कोई बड़ा अंतर होगा, इस तथ्य के अलावा कि invokestaticएक कम बायोटेक की आवश्यकता है। invokestaticऔर invokespecialदोनों की तुलना में थोड़ा तेज होना चाहिए invokevirtual, क्योंकि वे दोनों गतिशील के बजाय स्थैतिक बंधन का उपयोग करते हैं, लेकिन मुझे नहीं पता कि क्या अन्य की तुलना में तेज है। मुझे कोई अच्छा संदर्भ भी नहीं मिल रहा है। निकटतम मैं पा सकता हूं यह 1997 का जावावर्ल्ड लेख है , जो मूल रूप से आराम करता है जो मैंने अभी कहा था:

सबसे तेज़ निर्देश सबसे अधिक संभावना होंगे invokespecialऔर invokestatic, क्योंकि इन निर्देशों द्वारा लागू किए गए तरीके सांख्यिकीय रूप से बाध्य हैं। जब JVM इन निर्देशों के लिए प्रतीकात्मक संदर्भ को हल करता है और इसे एक प्रत्यक्ष संदर्भ के साथ बदल देता है, तो उस प्रत्यक्ष संदर्भ में संभवत: वास्तविक बायटेकॉड्स के लिए एक सूचक शामिल होगा।

लेकिन 1997 से कई चीजें बदल गई हैं।

इसलिए निष्कर्ष में ... मुझे लगता है कि मैं अभी भी वही कह रहा हूं जो मैंने पहले कहा था। गति को दूसरे पर एक चुनने का कारण नहीं होना चाहिए, क्योंकि यह एक माइक्रो-ऑप्टिमाइज़ेशन होगा।


इन सभी नकारात्मक वोटों के लिए एक बहुत ही सीधा जवाब जैसा लगता है। सत्य, न्याय के हितों में +1, ....
स्टीव बी।

धन्यवाद। (हालांकि मैं इसे नष्ट कर दिया और एक बिल्ला मिल गया है, जबकि यह कम से -3 था हो सकता था:। डी)
माइकल मायर्स

2
JIT कंपाइलर वैसे भी इनलाइन करेगा और उन्हें ऑप्टिमाइज़ करेगा, इसलिए bytecode के निर्देशों की मात्रा के साथ यह बहुत कम है कि यह कितनी तेजी से होगा।
एस्को लुओंटोला

3
इसलिए मैंने कहा "मुझे नहीं लगता कि इससे गति में कोई फर्क पड़ता है (और अगर ऐसा किया जाता है, तो यह संभवत: बहुत अधिक अंतर बनाने के लिए बहुत छोटा होगा।")
माइकल मायर्स

7
उस तरह के किसी भी माइक्रो ऑप्टिमाइज़ेशन में संलग्न होने से पहले, आपको हॉट स्पॉट कंपाइलर के प्रभाव पर विचार करना चाहिए। नीचे पंक्ति: मनुष्यों द्वारा पठनीयता के लिए अपना कोड लिखें और संकलनकर्ता के लिए अनुकूलन छोड़ दें
Ichthyo

18

मेरी व्यक्तिगत प्राथमिकता उन्हें स्थिर घोषित करने की होगी, क्योंकि यह स्पष्ट ध्वज है कि वे स्टेटलेस हैं।


18

उत्तर है, यह निर्भर करता है।

यदि सदस्य एक उदाहरण चर है जिसे आप जिस वस्तु के साथ काम कर रहे हैं उसके लिए विशिष्ट है, तो इसे एक पैरामीटर के रूप में क्यों पास करें?

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

public class Example {
   private Something member;

   public double compute() {
       double total = 0;
       total += computeOne();
       total += computeMore();
       return total;         
   }

   private double computeOne() { /* Process member here */ }
   private double computeMore() { /* Process member here */ } 
}

5
+1: भले ही उदाहरण खराब हो, लेकिन बहुत सारी विधियाँ जो COULD स्टैटिक हैं, एक खराब कोड गंध है। वैसे, स्थैतिक तरीके वास्तव में कवक हैं, वे ओओ बिल्कुल नहीं हैं। वे किसी अन्य वर्ग में एक विधि के रूप में हो सकते हैं, या आप एक ऐसे वर्ग को याद कर रहे होंगे जो यह कार्य विधि के रूप में हो सकता है।
बिल के

11

एक कारण हो सकता है कि आप स्थैतिक सहायक विधियों की घोषणा करना चाहें, यदि आपको उन्हें क्लास कंस्ट्रक्टर में "पहले" thisया फिर कॉल करने की आवश्यकता है super। उदाहरण के लिए:

public class MyClass extends SomeOtherClass { 
    public MyClass(String arg) {
       super(recoverInt(arg));
    }

    private static int recoverInt(String arg) {
       return Integer.parseInt(arg.substring(arg.length() - 1));
    }
}

यह एक संक्षिप्त उदाहरण है, लेकिन स्पष्ट रूप recoverIntसे इस मामले में एक उदाहरण विधि नहीं हो सकती है।


आप कंस्ट्रक्टर में एक इंस्टेंस विधि को कॉल कर सकते हैं, लेकिन यदि आप सुपर (...) या इस (...) के साथ किसी अन्य कंस्ट्रक्टर को सौंप रहे हैं, तो आप डेलिगेशन (लेकिन स्टैटिक्स) के बाद तक इंस्टेंस विधि को कॉल नहीं कर सकते ठीक है जैसा कि आप बताते हैं)
किप

10

मैं वास्तव में निजी स्थैतिक विधि के लिए स्पष्ट लाभ के बारे में नहीं सोच सकता। कहा जा रहा है कि, उन्हें गैर-स्थिर बनाने के लिए कोई विशेष लाभ नहीं है। यह मुख्य रूप से प्रस्तुति की बात है: आप उन्हें स्पष्ट रूप से इस तथ्य को रेखांकित करने के लिए स्थिर बनाना चाह सकते हैं कि वे किसी वस्तु को बदल नहीं रहे हैं।

विभिन्न एक्सेस विशेषाधिकारों के साथ विधि के लिए, मुझे लगता है कि दो मुख्य तर्क हैं:

  • किसी वस्तु का उदाहरण बनाए बिना स्थैतिक विधियों को कहा जा सकता है, जो उपयोगी हो सकता है
  • स्थैतिक तरीकों को विरासत में नहीं लिया जा सकता है, जो एक समस्या हो सकती है यदि आपको बहुरूपता की आवश्यकता है (लेकिन निजी तरीकों के लिए अप्रासंगिक है)।

इसके अलावा, अंतर बहुत छोटा है, और मुझे दृढ़ता से संदेह है कि अतिरिक्त पॉइंटर को इंस्टेंस विधि में पारित करने से महत्वपूर्ण अंतर पड़ता है।


4
इसे स्थिर नहीं बनाने का फायदा यह है कि कोई व्यक्ति विधि के व्यवहार को उप-वर्ग और ओवरराइड कर सकता है।
क्लिंट मिलर

7
अपनी निजी पद्धति को बंद करें ताकि आप इस विधि को ओवरराइड न कर सकें।
भूषण भंगले

वास्तव में, निजी पद्धति के लिए मुझे नहीं लगता कि इससे बहुत फर्क पड़ता है। सार्वजनिक तरीकों के लिए, हालांकि, मैं इस बात से सहमत हूं कि आप क्या कह रहे हैं
Axelle Ziegler

8

सही उत्तर है:

कोई भी विधि जो किसी क्षेत्र से कोई जानकारी नहीं लेती है, और किसी भी जानकारी को किसी क्षेत्र में नहीं डालती है, को उदाहरण विधि नहीं करनी है। कोई भी विधि जो अपनी कक्षा या वस्तु में किसी भी क्षेत्र का उपयोग या परिवर्तन नहीं करती है और एक स्थिर विधि हो सकती है।


5

या किसी विशेष कारण से [उन्हें स्थिर घोषित करने के लिए नहीं]?

हाँ।

उदाहरण के तरीकों के रूप में रखकर, आप अपने आप को बाद में एक अलग कार्यान्वयन प्रदान करने की अनुमति देते हैं।

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

इसलिए आप एक उपवर्ग बनाएँ और नए संस्करणों में वापस लौटें, और चूंकि विधियाँ उदाहरण के तौर तरीकों के रूप में घोषित की गई थीं, आप बस बहुरूपता को अपना काम करने देते हैं।

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

इसलिए, मेरी सिफारिश उन्हें उदाहरण के तरीकों के रूप में रखना है, और यदि संभव हो तो स्थैतिक से बचें।
भाषा द्वारा प्रदान की गई गतिशीलता का लाभ उठाएं।

कुछ हद तक संबंधित वीडियो के लिए यहां देखें: एक अच्छा एपीआई कैसे डिज़ाइन किया जाए और यह क्यों मायने रखता है

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


1
पूरी तरह से सहमत हूँ। मैं आमतौर पर सिर्फ इस कारण से स्टैटिक्स और प्राइवेट से बचने की कोशिश करता हूं। मुझे लगता है कि अन्य उत्तरों में से अधिकांश बिंदु छूट गए हैं।
क्लिंट मिलर

22
हम निजी सहायकों के बारे में बात कर रहे हैं , जिसका अर्थ है कि वे कक्षा के सार्वजनिक एपीआई का हिस्सा नहीं हैं। इसका मतलब यह है कि कुछ भी नहीं आपको बाद में एक अलग कार्यान्वयन प्रदान करने से रोकता है, उन्हें गैर-स्थिर बनाता है, या कोई अन्य परिवर्तन करता है।
जोनिक

Aaaahmm ... यह एक अच्छा बिंदु है जोनिक। फिर भी, एक अच्छी आदत बनाने के लिए पर्याप्त कारण होना चाहिए (निश्चित रूप से निश्चित रूप से बोलना)
OscarRyz

2
पूरी तरह से सहमत हूँ। जिस कक्षा में इसे परिभाषित किया गया है, उसे बदले बिना आप निजी पद्धति को बदलना चाहेंगे, इसका कोई अच्छा कारण नहीं है। आपके द्वारा सुझाया गया एकमात्र तरीका बाइट-कोड हेरफेर है।
पीटर लॉरी

2
यदि आप सुझाव देते हैं कि विधि निजी नहीं थी, तो मैं समझ सकता हूं, लेकिन फिर भी मैं आपको कल्पना की आवश्यकता के आधार पर डिजाइन करने के बजाय एक वर्तमान आवश्यकता के आधार पर डिजाइन करने का सुझाव दूंगा।
पीटर लॉरी

5

स्थैतिक तरीकों के बारे में एक मुद्दा यह है कि यह इकाई परीक्षणों में उपयोग करने के लिए ऑब्जेक्ट को अधिक कठिन बना सकता है । Mockito स्थैतिक तरीकों के लिए नकली नहीं बना सकते हैं और आप विधि का एक उपवर्ग कार्यान्वयन नहीं बना सकते हैं।


2
आपको निजी तरीकों के लिए परीक्षण नहीं लिखना चाहिए। देखें यहाँ । एक निजी विधि का परीक्षण करने की कोई आवश्यकता नहीं है कि यह स्थिर है या नहीं।
BW

@BW यह एक बहुत ही व्यक्तिपरक बात है। एक निजी विधि का परीक्षण करने के कई वैध कारण हैं।
रूहोला

4

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

यह इसका उपयोग अन्य स्थिर विधियों या कक्षा आरंभीकरण में करने की अनुमति देता है, अर्थात:

public class Example {
   //...

   //Only possible if computeOne is static
   public final static double COMPUTED_ONE = computeOne(new Something("1"));

   //...
}

3

इस तरह के मामलों में मेरी प्राथमिकता बनाने computeOneऔर computeMoreस्थिर तरीकों से है। कारण: इनकैप्सुलेशन। कम कोड जो आपके वर्ग के कार्यान्वयन के लिए उपयोग किया जाता है, बेहतर है।

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


3

मैं कुछ चीजों को स्पष्ट करना चाहूंगा जिन्हें अन्य पोस्टरों ने गलत जानकारी देते हुए कहा है।

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

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


लेकिन ऐसे स्थान हैं जहां केवल एक स्थिर विधि को बुलाया जा सकता है, जैसे मेरे उदाहरण में और क्रिस मार्शल के उदाहरण में
किप

हां अपने और क्रिस के जवाब को सही मानें। मैंने उन पर कोई टिप्पणी नहीं की क्योंकि वे सही उत्तर हैं। मैंने केवल गलत उत्तरों की बात की।
भूषण भंगेल

3

अनुभव से मैं बताता हूं कि इस तरह के निजी तरीके काफी सार्वभौमिक और पुन: प्रयोज्य होते हैं।

मुझे लगता है कि पहली बात यह है कि सवाल पूछना है कि क्या विधि वर्तमान वर्ग के संदर्भ के बाहर उपयोगी हो सकती है। यदि ऐसा है, तो मैं वास्तव में वही करूँगा जो हर कोई सुझाता है और इस पद्धति को कुछ बर्तनों के वर्ग के रूप में स्थिर करता है, जहाँ कोई व्यक्ति नई विधि को ठीक से लागू करने से पहले उम्मीद करता है।

इस तरह के सामान्य उपयोग निजी तरीके परियोजना में कोड के दोहराव के बड़े हिस्से के स्रोत हैं क्योंकि प्रत्येक डेवलपर स्वतंत्र रूप से उन्हें उसी जगह पर पुन: स्थापित करता है जहां उसे इसका उपयोग करने की आवश्यकता होती है। तो इस तरह के तरीकों का केंद्रीकरण एक रास्ता है।


2

स्थिर / गैर-स्थिर प्रश्न नीचे आता है "क्या मुझे वास्तव में इस वर्ग की वस्तु का उपयोग करने की आवश्यकता होगी"?

तो, क्या आप विभिन्न तरीकों के बीच की वस्तु को पार कर रहे हैं? क्या वस्तु में ऐसी जानकारी है जो स्थैतिक विधियों के संदर्भ में उपयोगी है? क्या कोई तरीका दोनों तरीकों को परिभाषित करने का नहीं है यदि आप उन्हें दोनों तरीकों से उपयोग करेंगे?

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


2

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


यह छोटा सा जवाब, अन्य उत्तरों के भार के नीचे दबे, वास्तव में मामले के सार को छूता है: वर्ग स्तर की कार्यक्षमता बनाम वस्तु स्तर की कार्यक्षमता।
इलाजेन्सो

धन्यवाद, एल, मैं वास्तव में इसकी सराहना करता हूं। मैं कुछ भी बुरा नहीं
मानूंगा

मैंने इसे टिप्पणी लिखने के समय +1 दिया।
eljenso

1
मैं असहमत हूं। निजी तरीकों के लिए कोड स्पष्टता अभी भी महत्वपूर्ण है। यह कम महत्वपूर्ण हो सकता है लेकिन इसके लिए प्रयास करना अभी भी कुछ है।
लीजेंडलेंग्थ

1

एक कारण यह है कि, बाकी सभी समान, स्थिर विधि कॉल तेजी से होना चाहिए। स्टैटिक विधियाँ आभासी नहीं हो सकती हैं, और इस सन्दर्भ में निहित नहीं है।


नीचे मेरा उत्तर देखें (मैंने विश्लेषण जोड़ा, क्योंकि यह पहले से ही -3 पर था, इसलिए यह बहुत दिखाई नहीं देता है)।
माइकल मायर्स

1

जितने लोगों ने कहा, इसे उतना ही स्थिर बनाइए ! यहाँ अंगूठे का नियम है जिसका मैं पालन करता हूं: यदि आपको लगता है कि विधि सिर्फ एक गणितीय कार्य है अर्थात यह स्टेटलेस है, तो इसमें कोई भी उदाहरण चर (=> कोई नीला रंग वैरिएक [ग्रहण] विधि में), और परिणाम शामिल नहीं है। विधि 'n' कॉल के लिए समान होगी (समान मापदंडों के साथ, संभोग), तो उस विधि को STATIC के रूप में चिह्नित करें।

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


1

ऑफ-टॉपिक: मैं हेल्पर तरीकों को स्टैंडअलोन यूटिलिटी / हेल्पर क्लास में रखता हूँ और इसमें केवल स्टैटिक तरीके होते हैं।

उपयोग के बिंदु पर सहायक विधियाँ होने के साथ परेशानी ('एक ही कक्षा' पढ़ें) यह है कि लाइन के नीचे कोई व्यक्ति अपने असंबंधित सहायक तरीकों को उसी स्थान पर पोस्ट करने का विकल्प चुन सकता है


-1: SO एक मैसेजिंग फोरम नहीं है। आप वास्तव में एक उचित प्रश्न पूछकर बेहतर करेंगे।
स्टु थॉम्पसन

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

1
class Whatever {

    public static varType myVar = initializeClassVariable();

    private static varType initializeClassVariable() {

        //initialization code goes here
    }
}

निजी स्थिर विधियों का लाभ यह है कि बाद में उनका पुन: उपयोग किया जा सकता है यदि आपको वर्ग चर को फिर से संगठित करने की आवश्यकता है।


1
  1. स्टैटिक मोडिफायर के बिना आप यह पता नहीं लगा सकते हैं कि अतिरिक्त विश्लेषण के बिना विधि स्टैटिबल है जो आसानी से हो सकती है जब आप (री) विधि लिखते हैं।

  2. तब "स्टैटिक" संशोधक आपको अन्य चीजों के अलावा रिफैक्टिंग के बारे में विचार दे सकता है जो दूसरों को अप्राप्य लग सकते हैं। उदा। विधि को किसी उपयोगिता वर्ग में ले जाना या उसे सदस्य विधि में परिवर्तित करना ।।


0

मैं उन्हें स्टेटलेस के रूप में फ़्लैग करने के लिए स्टेटिक घोषित करूँगा।

जावा के पास मामूली संचालन के लिए एक बेहतर तंत्र नहीं है जो निर्यात नहीं किया जाता है, इसलिए मुझे लगता है कि निजी स्थैतिक स्वीकार्य है।

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