2012-10-05 8 views
5

क्या हमें वास्तव में जावा में स्थिर अंतिम स्थिरांक की आवश्यकता है?निरंतर मान को वापस करने वाले विधियों का उपयोग

मान लें मैं निम्नलिखित कोड है:

public class Test { 

    public static final int A = 1234; 

    public static int getA() 
    { 
     return 1234; 
    } 
} 

आप दक्षता के मामले में निम्नलिखित दो मामलों की तुलना सकते हैं?

  1. Test.A

  2. Test.getA()

+0

http://codebetter.com/raymondlewallen/2005/07/19/4-major-principles-of-object-oriented-programming/ – talnicolas

+0

मैं इस बारे में उत्सुक हूं कि बाइटकोड क्या होता है। 'स्थिर अंतिम 'चर लौटने वाली' स्थिर 'विधि अत्यधिक अनुकूलन प्रतीत होती है। – Brian

उत्तर

9

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

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

गणित की दुनिया से, इस नियम के लिए एक उल्लेखनीय अपवाद शुद्ध स्थिरांक है: यह Math.PI तक पहुंच को समाहित करने के लिए अधिक समझ में नहीं आता है, क्योंकि इस मौलिक स्थिरता का मूल्य बदलने का कोई मौका नहीं है , विधि को स्विच करने की आवश्यकता को संकेत देने के लिए आपके प्रोग्राम में मूल्य प्राप्त किया जाता है।

+0

+1 सही हैं। – Gamb

+0

Math.PI एक अच्छा उदाहरण – Jayy

+1

खासकर जब से स्थिरांक के संदर्भों को कोड का उपयोग करने के लिए वर्बैटिम की प्रतिलिपि बनाई जाती है, इसलिए यदि कोई निरंतर परिवर्तन होता है, तो इसका उपयोग करने वाला कोई भी कोड नया मान प्राप्त करने के लिए पुनः संकलित किया जाना चाहिए। –

1

दक्षता के मामले में, test.getA() अक्सर JIT द्वारा test.A के बराबर करने के लिए कम किया जा सकता। फिर भी, अंतर सबसे अच्छा उपेक्षित होगा।

क्या हमें वास्तव में जावा में स्थिर अंतिम स्थिरांक की आवश्यकता है?

नहीं, लेकिन यह बार-बार आवंटन को रोकने में मदद करता है।

+0

जेआईटी वास्तव में इसे अनुकूलित करेगा, लेकिन यह [बचने का विश्लेषण] नहीं है (http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#escapeAnalysis)। – Jesper

+0

@ जेस्पर, विषय पर मेरी याददाश्त को ताज़ा करने के बाद, मुझे लगता है कि आप लचीलापन लाभ के लिए –

0

जो मामला आप दिखाते हैं वह काफी मामूली है, जिसका मेरा मानना ​​है कि इसका इरादा है। आपका पहला मामला अधिक प्रत्यक्ष और कुशल है क्योंकि यह ढेर पर एक कम कॉल है, लेकिन मेरा मानना ​​है कि बेहतर कोडिंग शैली दोनों को गठबंधन करना होगा। मुझे लगता है कि यह एकमात्र ऐसा स्थान नहीं होगा जहां आप अपनी कक्षा में इस चर का उपयोग करें।

public class Test { 

public static final int A = 1234; 

public static int getA() 
{ 
    return A; 
} 

public static int doSomething() 
{ 
    int result = A * 10; 
    //do more stuff 
    return result; 
} 
} 

यह आपको केवल एक ही स्थान पर अपने चर बदल अगर यह कभी बदलते की जरूरत है और अपने कार्यक्रम के दौरान अपेक्षित परिणाम प्राप्त करने के लिए अनुमति देता है। निजी तौर पर, मैं केवल एक विधि प्राप्त करने की स्थिरता के लिए int निजी बना देता हूं, जो कि कक्षाओं को कैसे स्थापित किया जाना चाहिए। इस तरह आप कभी भी ऐसी समस्या में नहीं चलेगा जहां आपको याद नहीं किया जा सकता है कि आपको चर नाम के बाद '()' की आवश्यकता है और कक्षा के बाहर रहने वाले सभी चर समान तरीके से उपयोग किए जाते हैं। इनमें से अधिकांश सिर्फ कोडिंग शैली है और न तो सही या गलत है।

1

स्टेटिक अंतिम चर को बाहरी कोड द्वारा बदला नहीं जा सकता है, इसलिए उन्हें encapsulate करने की कोई आवश्यकता नहीं है।

इसके अलावा, कोई पैरामीटर वाला एक स्थिर विधि किसी ऑब्जेक्ट के राज्य तक पहुंच का सुझाव देती है, जो एक झूठ है, क्योंकि विधि स्थैतिक है।

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

2

staticfinal स्थिरांक विधि से लौटाए गए शाब्दिक मूल्यों से अलग व्यवहार करते हैं। जावा कंपाइलर कुछ मामलों में संकलन समय पर भी इनका उपयोग करता है।

एक उदाहरण

public static boolean DEBUG = false; 

... 

if (DEBUG) 
{ 
    ...do something... 
} 

बनाम

public boolean debug() 
{ 
    return false; 
} 

... 

if (debug()) 
{ 
    ...do something 2... 
} 

पहले मामले में, हालत और ... कुछ करना ... कोड संकलित बाइट-कोड में शामिल नहीं किया जाएगा (कक्षा फाइल)। दूसरे मामले में, स्थिति और ... कुछ 2 करें ... कोड शामिल किया जाएगा लेकिन कभी निष्पादित नहीं होगा - जेआईटी इस मामले में पर्याप्त विश्लेषण कर सकता है हालांकि रनटाइम पर कोड को निकालने के लिए।

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

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