2011-06-24 13 views
19

मैं स्काला में प्रवेश का उदाहरण देखा है, और यह आमतौर पर इस तरह दिखता है:स्कैला * बिना * लॉग इन करने के लिए * प्रत्येक उदाहरण * में लॉगजर का संदर्भ कैसे करें?

import org.slf4j.LoggerFactory 

trait Loggable { 
    private lazy val logger = LoggerFactory.getLogger(getClass) 
    protected def debug(msg: => AnyRef, t: => Throwable = null): Unit = 
    {...} 
} 

यह ठोस प्रवेश ढांचे के स्वतंत्र लगता है। हालांकि यह काम करता है, यह प्रत्येक उदाहरण में एक बाहरी आलसी वैल भी प्रस्तुत करता है जो लॉगिंग करना चाहता है, जो पूरे एप्लिकेशन के हर उदाहरण के साथ हो सकता है। यह मेरे लिए बहुत भारी लगता है, विशेष रूप से यदि आपके पास कुछ विशिष्ट प्रकार के "छोटे उदाहरण" हैं।

क्या विरासत का उपयोग करके, कंक्रीट वर्ग के ऑब्जेक्ट में लॉगर डालने का कोई तरीका है? अगर मुझे कक्षा के ऑब्जेक्ट में लॉगर को स्पष्ट रूप से घोषित करना है, और इसे स्पष्ट रूप से कक्षा/विशेषता से संदर्भित करना है, तो मैंने लगभग उतना ही कोड लिखा है जैसे कि मैंने कोई पुन: उपयोग नहीं किया था।

एक गैर प्रवेश करने विशिष्ट संदर्भ में व्यक्त, समस्या होगा:

मैं एक विशेषता में कैसे घोषित है कि लागू करने वर्ग प्रकार एक्स के एक सिंगलटन वस्तु होनी आवश्यक है और इस सिंगलटन वस्तु सुलभ होनी चाहिए कि विधि डीई एक्स के माध्यम से: एक्स?

मैं बस एक अमूर्त विधि को परिभाषित नहीं कर सकता, क्योंकि कक्षा में केवल एक ही कार्यान्वयन हो सकता है। मैं चाहता हूं कि एक सुपर-क्लास में लॉगिंग मुझे सुपर-क्लास सिंगलटन प्राप्त करे, और उप-वर्ग में लॉग इन करने से मुझे उप-वर्ग सिंगलटन मिल जाता है। या अधिक सरलता से रखें, मैं जावा में पारंपरिक लॉगिंग की तरह काम करने के लिए स्कैला में लॉगिंग करना चाहता हूं, लॉगिंग करने वाले वर्ग के लिए विशिष्ट स्थिर लॉगर्स का उपयोग कर। स्कैला का मेरा वर्तमान ज्ञान मुझे बताता है कि जावा में ऐसा ही करने के बिना यह संभव नहीं है, बिना "बेहतर" स्कैला का उपयोग करने से कोई लाभ नहीं।

उत्तर

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