दिलचस्प पोस्ट
कंसोल (। Com) () सतर्क () से बेहतर क्यों माना जाता है? PHP जांचें कि फाइल में स्ट्रिंग है प्रेषण के बाद – जीसीडी स्विफ्ट में? गिट के साथ एक नई शाखा में सबसे हालिया प्रतिबद्धताएं ले जाएं मैं दिन-तिथि (पायथन) में कैसे परिवर्तित करूं? एक जीआईटी भंडार में, निर्देशिका को कैसे ठीक से नाम दिया जाए? जब Flask.g इस्तेमाल किया जाना चाहिए? सिंगल टेस्ट रनिंग यूनिट से। टेस्ट सीज़ कमांड लाइन के माध्यम से कच्ची फाइल को एसडीकार्ड में कॉपी करना है? JQuery के साथ HTML स्ट्रिंग से बचें पीडीएफ में एसवीजी कन्वर्ट करें एंड्रॉइड फ्रेगमेंट ट्रान्ससेक्शन कस्टम एनिमेशन (अज्ञात एनिमेशन का नाम: अनुवाद) ऐरेलिस्ट <MyCustomClass> को JSONArray पर परिवर्तित करें PHP DomDocument UTF-8 वर्ण (☆) को संभालने में असफल रहा है लिस्ट निर्देशिका सी सामग्री का उपयोग सी और विंडोज

कैसे जल्दी से निर्धारित करने के लिए कि एक विधि जावा में अधिरोहित है

एक संभावित अनुकूलन मैं अपने तरीकों में से एक पर लागू कर सकता हूं, अगर मैं यह निर्धारित कर सकता हूं कि एक ही कक्षा में एक अन्य विधि ओवरराइड नहीं है यह केवल मामूली अनुकूलन है, इसलिए प्रतिबिंब सवाल से बाहर है क्या मुझे सिर्फ एक संरक्षित विधि बनानी चाहिए जो प्रश्न करता है कि क्या विधि में ओवरराइड किया गया है या नहीं, जैसे कि उप-वर्ग यह सच वापस कर सकता है?

Solutions Collecting From Web of "कैसे जल्दी से निर्धारित करने के लिए कि एक विधि जावा में अधिरोहित है"

मैं ऐसा नहीं करूँगा। यह इनकैप्सुलेशन का उल्लंघन करता है और इस बारे में अनुबंध को बदलता है कि आपके वर्ग को इसके बारे में जानने वाले क्रियान्वयनकर्ताओं के बिना क्या करना चाहिए।

अगर आपको यह करना होगा, हालांकि, सबसे अच्छा तरीका है कि इन्हें आमंत्रित करना है

class.getMethod("myMethod").getDeclaringClass(); 

अगर वापस आ गया वर्ग आपकी ही है, तो यह ओवरराइड नहीं है; अगर यह कुछ और है, तो उस उपवर्ग ने इसे ओवरराइड कर दिया है हाँ, यह प्रतिबिंब है, लेकिन यह अभी भी बहुत सस्ते है।

मैं आपकी संरक्षित-विधि दृष्टिकोण की तरह करता हूं, हालांकि। यह ऐसा कुछ दिखाई देगा:

 public class ExpensiveStrategy { public void expensiveMethod() { // ... if (employOptimization()) { // take a shortcut } } protected boolean employOptimization() { return false; } } public class TargetedStrategy extends ExpensiveStrategy { @Override protected boolean employOptimization() { return true; // Now we can shortcut ExpensiveStrategy. } } 

ठीक है, मेरा अनुकूलन मामला-दर-मामला आधार पर एक छोटी उपज है, और यह केवल चीजों की गति बढ़ाता है क्योंकि इसे प्रति सेकंड सैकड़ों बार कहा जाता है

आप देखना चाहते हैं कि जावा अनुकूलक क्या कर सकता है। आपके हाथ से कोडित अनुकूलन आवश्यक नहीं हो सकता है।

यदि आप तय करते हैं कि हाथ से कोडित अनुकूलन आवश्यक है, तो आपके द्वारा वर्णित संरक्षित विधि दृष्टिकोण एक अच्छा विचार नहीं है क्योंकि यह आपके कार्यान्वयन के विवरण को उजागर करता है

कार्यक्रम के जीवनकाल के दौरान समारोह को कितनी बार कहा जाए? विशिष्ट एकल विधि के लिए प्रतिबिंब बहुत बुरा नहीं होना चाहिए। अगर कार्यक्रम के जीवनकाल में ज्यादा समय नहीं है, तो मेरी सिफारिश सरल है, और छोटे अनुकूलन को शामिल न करें।

याकूब

एपोटेट सबक्लासेस जो विशेष विधि को ओवरराइड करते हैं @OverridesMethodX।

कक्षा लोड (यानी, एक static ब्लॉक में) पर आवश्यक चिंतनशील कार्य करें ताकि आप अंतिम बूलियन ध्वज के माध्यम से जानकारी प्रकाशित कर सकें। उसके बाद, जब और जब आपको इसकी आवश्यकता होती है तो झंडा पूछें।

हो सकता है कि रणनीति पैटर्न के माध्यम से ऐसा करने का एक क्लीनर तरीका है, हालांकि मुझे नहीं पता कि आपके बाकी आवेदन और डेटा कैसे तैयार किए जाते हैं लेकिन ऐसा लगता है कि यह फिट हो सकता है

मुझे किसी भी तरह से ऐसा किया जब मुझे एक समान समस्या का सामना करना पड़ा था। आप एक अनुमान लगा सकते हैं जो निर्णय लेता है कि डेटा के आधार पर उपयोग करने के लिए कौन सी रणनीति का उपयोग किया जाना चाहिए।

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

हालांकि सावधान रहना, ऐसे रिफैक्टरिंग जब केवल अनुकूलन आधार पर किया जाता है, तो लगभग अनिवार्य रूप से आपदा पैदा होती है। अगर यह मामला है, तो मैं ऊपर उल्लिखित परावर्तित दृष्टिकोण को ले जाऊंगा। यह विरासत अनुबंध को परिवर्तित नहीं करता है, और जब एक बार केवल उप-वर्ग के लिए ठीक से काम किया जाता है जो इसे आवेदन के रनटाइम जीवन के लिए आवश्यक होता है।

मुझे पता है कि यह थोड़ा पुराना सवाल है, लेकिन अन्य गोगलर्स के लिए:

मैं इंटरफेस का उपयोग कर एक अलग समाधान के साथ आया था।

 class FastSub extends Super {} class SlowSub extends Super implements Super.LetMeHandleThis { void doSomethingSlow() { //not optimized } } class Super { static interface LetMeHandleThis { void doSomethingSlow(); } void doSomething() { if (this instanceof LetMeHandleThis) ((LetMeHandleThis) this).doSomethingSlow(); else doSomethingFast(); } private final void doSomethingFast() { //optimized } } 

या फिर इसके विपरीत:

 class FastSub extends Super implements Super.OptimizeMe {} class SlowSub extends Super { void doSomethingSlow() { //not optimized } } class Super { static interface OptimizeMe {} void doSomething() { if (this instanceof OptimizeMe) doSomethingFast(); else doSomethingSlow(); } private final void doSomethingFast() { //optimized } void doSomethingSlow(){} } 

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

आप एक ही रनटाइम कक्षा को बार-बार देख सकते हैं। तो आप Class पर WeakHashMap में चेक के परिणामों को बचा सकते हैं।

मेरे कोड को java.awt.Component में देखें। एक उदाहरण के लिए java.awt.Component के साथ काम कर रहे java.awt.Component

 private static boolean isMethodImplemented(Object obj, String name) { try { Class<? extends Object> clazz = obj.getClass(); return clazz.getMethod(name).getDeclaringClass().equals(clazz); } catch (SecurityException e) { log.error("{}", e); } catch (NoSuchMethodException e) { log.error("{}", e); } return false; }