2013-06-07 21 views
5

सी में में एक स्थानीय चर प्रारंभ करने में कैसे ++, निम्नलिखित कोड:जावा केवल एक बार

#include <stdio.h> 

static const char *init() 
{ 
    printf("in init()\n"); 
} 

static void func() 
{ 
    static const char *str = init(); 
    printf("in func()\n"); 
} 

int main() 
{ 
    for (int i=0; i<10; ++i) { 
     func(); 
    } 
    return 0; 
} 

पता चलता है कि समारोह के कई invokations() के बावजूद, str केवल एक बार से आरंभ नहीं हो जाता फ़ंक्शन init() में एक ट्रेस संदेश प्रिंट करना str प्रारंभ करने के लिए उपयोग किया जाता है। जब चलाने के लिए, वहाँ का पता लगाने के 10 लाइनों की कुल, एक बार init के लिए() समारोह()

जावा में, निम्न कोड नहीं करना चाहिए एक ही बात के लिए और 10 बार कर रहे हैं?

class test { 
    private String init() 
    { 
     System.out.println("in init()"); 
     return "FOO"; 
    } 

    private void func() 
    { 
     final String str = init(); 
     System.out.println("in func()"); 
    } 

    public test() 
    { 
     for (int i=0; i<10; ++i) { 
      func(); 
     } 
    } 

    public static main(String[] args) 
    { 
     test app = new test(); 
    } 
} 

जब चलाने के लिए, वहाँ उत्पादन का 20 लाइनों, 10 init के लिए प्रत्येक() और समारोह() हैं। मैंने अंतिम चर के बारे में जो पढ़ा है उसके आधार पर, मैंने सोचा कि यह वही व्यवहार करेगा। इसलिए मैंने स्थिर अंतिम की कोशिश की और यह संकलित नहीं होगा (न ही स्थिर) क्या ऐसा करने का कोई तरीका है? मुझे से मेरी कक्षा में कई अलग-अलग तरीकों से समय लेने वाली प्रारंभिक फ़ंक्शन को कॉल करने की आवश्यकता है, इसलिए चर को कक्षा स्कोप में ले जाना काम नहीं करेगा। आगे, चूंकि स्थानीय चर स्वचालित रूप से प्रारंभ नहीं होते हैं, इसलिए शून्य के लिए मान को मानने से पहले चर के चारों ओर परीक्षण शामिल नहीं हो सकता है। मुझे लगता है कि मैं अपनी कक्षा में प्रत्येक विधि के लिए कक्षा के दायरे में एक चर बना सकता हूं, लेकिन इसे प्रबंधित करने में दर्द होता है। सबसे अच्छा सादृश्य कुछ अगर मैं हर विधि में निम्नलिखित की तरह कुछ शामिल करने के लिए थे होगा: इस मामले प्रत्येक विधि में एक अनूठा मूल्य मिल जाएगा में

public myfunc1() 
{ 
    final String funcName = java.lang.Thread.currentThread().getStackTrace()[1].getMethodName(); 
} 
public myfunc2() 
{ 
    final String funcName = java.lang.Thread.currentThread().getStackTrace()[1].getMethodName(); 
} 

funcName, लेकिन प्रारंभ महंगा है।

+0

आपको स्ट्रिंग स्ट्र और फ़ंक्शन init() को स्थिर करने की आवश्यकता है स्थिर – maverik

+0

_str_ _static_ नहीं हो सकता है, यह संकलित नहीं होगा। _init() _ _static_ नहीं हो सकता क्योंकि यह उदाहरण डेटा पर निर्भर करता है। – Xaq

+0

http: // ideone।कॉम/एनएनएन 6 एम 9 – maverik

उत्तर

1

final क्वालीफायर एक विधि विधि के माध्यम से परिवर्तनीय स्थिर बनाता है।

चूंकि आप प्रति उदाहरण एक मान चाहते हैं, तो आप विधि के बाहर एक उदाहरण सदस्य चर का उपयोग कर सकते हैं।

private final String str = init(); 

private void func() 
{ 
    System.out.println("in func()"); 
} 

यदि आप सभी विधि में एक ही मूल्य सभी उदाहरणों के लिए, आप एक स्थिर सदस्य चर का उपयोग कर सकता है, विधि के बाहर कॉल करना चाहता था।

private static final String str = init(); 

private void func() 
{ 
    System.out.println("in func()"); 
} 
+0

प्रश्न नहीं, प्रत्येक एकाधिक आवंटित सदस्य फ़ंक्शन के लिए एकल प्रारंभिक कॉल। अंत में उदाहरण देखें: _myfunc1() _ और _myfunc2() _ – Xaq

+0

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

+0

मुझे पता है कि, जैसा कि सवाल में बताया गया है, मैं अपनी कक्षा में हर विधि के लिए एक उदाहरण चर बनाने के बजाय समाधान का प्रबंधन करना आसान था। – Xaq

4

निम्नलिखित एक काफी नज़दीकी अनुमान होता है:

class test { 

    private static final String str = init(); 

    private static String init() 
    { 
     System.out.println("in init()"); 
     return "FOO"; 
    } 

    private void func() 
    { 
     System.out.println("in func()"); 
    } 

    public test() 
    { 
     for (int i=0; i<10; ++i) { 
      func(); 
     } 
    } 

    public static void main(String[] args) 
    { 
     test app = new test(); 
    } 
} 

ध्यान दें कि जब वर्ग, भरी हुई है जब नहीं func() पहली बार के लिए कहा जाता है str आरंभ नहीं हो जाता।

+0

और यदि 'init()' को वास्तव में संदर्भ की आवश्यकता है, तो सदस्य जो वर्ग निर्माण या बाद में प्रारंभ नहीं किए जाते हैं, 'str' को शून्य में प्रारंभ करें और' init() 'केवल अपनी लंबी चीज़ करें' अगर (str == null) '। – CPerkins

+0

दुर्भाग्यवश, यह उत्तर प्रदान नहीं करता है, इसलिए मैंने अपने प्रश्न के अंत में आगे के उदाहरण या _myfunc1() और _myfunc2() _ प्रदान किए हैं। – Xaq

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