2011-03-11 21 views
8

मैं PHP Scope Resolution Operator जैसे स्थिर संदर्भ तरीके में जावा में वर्तमान कक्षा के "स्वयं" संदर्भ की तलाश में हूं?जावा "स्वयं" (स्थिर) संदर्भ

समाधान: दायरे से बाहर तोड़ें?

static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName()); 

पुराने ढंग का तरीका होगा:

static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName()); 

वहाँ रहे हैं किसी भी विकल्प सावधान रहें, यह वास्तव में धीमी गति से (कारक 300) के द्वारा एक स्थिर परिभाषा की तुलना में है? मैं एक अमूर्त वर्ग में लॉगर परिभाषा डालने का एक तरीका ढूंढ रहा हूं। लॉगर को उस वर्ग को निर्धारित करना चाहिए जिसे इसे स्वयं से बुलाया जा रहा है।

उत्तर

12

थोड़ा तेज

static final Logger LOG = LoggerFactory.getLogger(
     Thread.currentThread().getStackTrace()[0].getClassName()); 

आप इस 1000 बार करते हैं यह यह इस तरह से कर रही है() Class.class.getName का उपयोग कर 36 एमएस और 60 एमएस ले जाएगा। शायद इसके बारे में चिंता करने लायक नहीं है। ;)

3

आपको लॉगर का उत्तराधिकारी नहीं होना चाहिए। बस प्रत्येक वर्ग में लॉगर घोषित करें।

लेकिन अगर आप इस तरह के उपयोगी लगता है नहीं करना चाहते, बस नहीं यह स्थिर कर सकता हूँ)

0

मुझे नहीं लगता कि वहाँ किसी भी विकल्प है कि काफी अपने प्रश्न में दो को अलग कर रहे हैं।

आप इस प्रकार का सहायक विधि बना सकते हैं: तो

static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname()); 

public static String getCallingClassname() { 
    return new RuntimeException().getStackTrace()[1].getClassName(); 
} 

और लेकिन यह है कि मूल संस्करण के रूप में के रूप में महंगा है। (एफडब्ल्यूआईडब्ल्यू - धीमी गति से 300 गुना संभवतः एक प्रमुख चिंता नहीं है, जब तक कि आपके पास इनमें से हजारों लॉगर्स नहीं हैं। इनमें से प्रत्येक स्थिरता केवल एक बार शुरू की जाती है ...)

मेरी निजी वरीयता "पुराने फैशन" तरीके के लिए है इसे कर रहा हूँ।

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