2013-07-29 13 views
6

मैंने हाल ही में (4 दिन पूर्व) जावा में प्रोग्रामिंग शुरू कर दी है। मेरे पास सी ++ और PHP से कुछ समग्र प्रोग्रामिंग अनुभव है। मेरा सवाल है: क्या हम जावा में एक समारोह को कार्यान्वित कर सकते हैं, जो कि सभी वर्गों में उपलब्ध है? मैं कुछ वैश्विक लॉगिंग फ़ंक्शन के बारे में सोच रहा हूं, मुझे कई स्थानों पर कॉल करने की आवश्यकता है (लॉग इवेंट, त्रुटियां इत्यादि)।जावा फ़ंक्शन (विधि) हर जगह उपलब्ध (वैश्विक)

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

public class A extends SomeClass { 
    String error = "Error from class A"; 
    logEvent(error); 
} 

public class B extends SomeOtherClass { 
    String error = "Error from class B"; 
    logEvent(error); 
} 
+0

आप बुराई 'Singleton' पैटर्न के बारे में पढ़ सकते हैं। –

+3

@LeeMeador "बुराई" राय का विषय है। – hexafraction

उत्तर

26

किसी भी वर्ग में एक स्थिर विधि रखो:

यहाँ कैसे मैं इसे का उपयोग करना चाहते है ClassName.functionName()

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

तक पहुंचने के लिए क्लास को तुरंत चालू करने की आवश्यकता नहीं है लेकिन जावा में सबकुछ कक्षा में होना चाहिए, इसलिए आप इसे बिना एक्सेस कर सकते हैं कक्षा का नाम

+1

यदि आपके पास स्थैतिक विधियां पसंद नहीं हैं तो आपके पास एक स्थिर विधि भी हो सकती है जो कक्षा के एकल स्वीकृत उदाहरण को लौटाती है। कक्षा कन्स्ट्रक्टर को निजी बनाएं और एक उदाहरण को स्थिर क्षेत्र में रखें। –

+4

आप एक स्थिर आयात का भी उपयोग कर सकते हैं ताकि आप प्रत्येक उपयोग साइट पर कक्षा के नाम के साथ अर्हता प्राप्त किए बिना स्थैतिक विधि का उपयोग कर सकें। – DaoWen

+0

@ दाओवेन अच्छा बिंदु, मैं जावा की उस विशेषता के बारे में भूल गया। अधिक जानकारी के लिए: http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html लेकिन ध्यान रखें कि स्थिर आयात कुछ हद तक डूब गए हैं, उन्हें आसानी से दुरुपयोग किया जा सकता है। मुझे नहीं लगता कि हर बार कक्षा का नाम टाइप करना इतना बड़ा सौदा है, और यह कोड को साफ रखता है। –

0

आप स्थिर विधि का उपयोग कर सकते हैं।

एक स्थिर विधि के साथ एक वर्ग को परिभाषित करें:

public class Util{ 
    public static void logEvent(String error){ 
     ... 
    } 
} 

फिर, अगर आप इस तरह की तरह स्थिर metod का उपयोग कर सकते हैं:

public class A extends SomeClass { 
    String error = "Error from class A"; 
    Util.logEvent(error); 
} 

आप एक बार देख यहां ले स्थिर विधि के बारे में अधिक जानने के लिए कर सकते हैं, http://www.leepoint.net/notes-java/flow/methods/50static-methods.html

+0

मुझे स्थिर तरीकों के बारे में पता है, लेकिन जब भी मैं उनका उपयोग करता हूं, मैं कक्षा के नाम लिखने से बचना चाहता हूं (20 या 50 कॉल के बाद यह निराशाजनक हो सकता है :))। लेकिन मैं उपरोक्त वर्णित @DaoWen के रूप में स्थिर आयात कर सकता हूं। – Mars

6

आप स्थिर विधि का उपयोग करना चाहिए:

package xxx; 

public class Util{ 
    public static void logEvent(String error){ 
    ... 
    } 
} 

और आयात स्थिर:

import static xxx.Util.*; 

public class A extends SomeClass { 
    String error = "Error from class A"; 
    logEvent(error); 
} 
+0

धन्यवाद, यह वही था जो मैं ढूंढ रहा था! पहले कभी "आयात स्थिर" कभी नहीं देखा। – BadCash

+0

मैं भी मेरे लिए काम करता हूं। आपका बहुत बहुत धन्यवाद – hershkoy

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