2010-08-08 13 views
6

multimethods का उपयोग करके हम मौजूदा जावा कक्षाओं में विधियों को जोड़ सकते हैं। मेरा सवाल यह है कि क्लोजर कोड से, एक विशिष्ट विधि को फिर से परिभाषित करना संभव है या नहीं। उदाहरण के लिए, यदि आप निम्नलिखित वर्ग है,क्या क्लोजर से जावा विधियों को फिर से परिभाषित करना संभव है?

public class Shape { 
    public void draw() { 
     ... 
    } 
} 

मैं इस जैसे विधि से पहले एक जोड़ने के लिए कुछ को चलाने के लिए, सक्षम होने के लिए करना चाहते हैं:

(attach-to-method Shape/draw :before 
    (println "... about to draw a shape")) 

और उस प्रपत्र मूल्यांकन करने के बाद, ड्रॉ करने के लिए आने वाली सभी कॉल कॉल करने से पहले एक स्ट्रिंग प्रिंट करना शुरू कर देंगे।

एओपी जैसी व्यवहार के पहले/बाद/आसपास के इस अनुलग्नक के साथ मेरा उद्देश्य यह है कि मौजूदा उदाहरण पर उस विधि को कॉल करने वाला एक ढांचा गतिशील रूप से बदला जा सकता है और नए संलग्न कोड को चलाने शुरू कर सकता है। वर्तमान में मैं इसके लिए AspectJ का उपयोग कर रहा हूं, लेकिन मुझे एक बिंदु मिल रहा है जहां एक अलग कंपाइलर का उपयोग करना एक विकल्प नहीं है, और मुझे यह जानकर उत्सुकता है कि क्या मैं सिर्फ AspectJ को हटा सकता हूं।

उत्तर

8

लघु जवाब: नहीं

जावा में के रूप में, एक वर्ग को संशोधित करने के लिए एक ही रास्ता विस्तार करने के लिए (उपवर्ग) यह है। आप Shape का विस्तार कर सकते हैं और draw विधि ओवरराइड कर सकते हैं (drawfinal घोषित नहीं किया गया है)। क्लोजर में, इसे proxy या gen-class के साथ पूरा किया जा सकता है।

+0

ठीक है, धन्यवाद। मुझे 'प्रॉक्सी' और 'जेन-क्लास' के बारे में पता था, मैं सिर्फ यह सुनिश्चित करना चाहता था कि क्लोजर पर विधि पुनर्वितरण अभी भी अनुपलब्ध था - मुझे कुछ उम्मीद थी कि कुछ अस्पष्ट JVM हालिया परिवर्तन जिनके अस्तित्व से मुझे अनजान था, इसे सक्षम कर सकता था, लेकिन मुझे लगता है मुझे तब AspectJ के साथ रहना होगा। धन्यवाद, स्टुअर्ट और ब्रायन! – Edgar

3

यदि आप जावा में ऐसा नहीं कर सकते हैं, तो आप क्लोजर में ऐसा नहीं कर सकते हैं।

+3

ऐसा नहीं है कि "अगर आप इसे JVM में नहीं कर सकते हैं, तो आप इसे क्लोजर में नहीं कर सकते"? और इस प्रकार हां, मुझे लगता है कि मैं क्लोजर के बजाय, "JVM में यह संभव है" के लिए अपने प्रश्न को दोबारा सुधार सकता हूं। मैंने केवल भाषा फ़िल्टर की क्योंकि मैं जानना चाहता था कि क्लोजर पर विशेष रूप से इस मुद्दे से निपटने के लिए प्रयास किए जा चुके हैं या नहीं। – Edgar

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