2009-12-19 17 views
10

क्या एक क्लास विधि में कक्षा में वापस जाना संभव है? मैं समझाता ...जावा: रिटर्न क्लास (उदाहरण नहीं)

मेरे पास है:

public class A { public static void blah(){} } 
public class B { } 

मैं बी डायन में एक स्थिर विधि बनाना चाहते हैं देता है A। तो अगर आप कर सकते हैं:

A.blah(); 

और

B.getA().blah(); 

यह A का उदाहरण बनाकर बिना। बस इसे स्थिर तरीकों का उपयोग करें।

क्या यह संभव है?

+1

या तो http://gbracha.blogspot.com/2008/02/cutting-out-static.html पढ़ने के लिए या सी जानने के लिए और समारोह संकेत का उपयोग करें। –

+0

इस तरह का कोई जवाब नहीं है ... स्कैला स्थैतिक तरीकों के स्थान पर सिंगलटन ऑब्जेक्ट्स का उपयोग करता है (जो वास्तव में बहुत ऑब्जेक्ट उन्मुख नहीं हैं)। यदि आप स्कैला का उपयोग करना चाहते थे तो आप बहुत अधिक * कर सकते हैं * इस तरह की चीज –

उत्तर

7

यह @ irreputable के जवाब का एक खंडन है। के दो भागों में इस टूट करते हैं:

A a = B.getA(); 
a.blah(); 

पहले बयान एक (इस मामले में नल) A के कहने लौटा रहा है, और दूसरा बयान है कि उदाहरण अनदेखी और A.blah() बुला रहा है। तो, इन बयानों वास्तव में

B.getA(); 
A.blah(); 

या के बराबर हैं (दिए गए getA() पक्ष प्रभाव से मुक्त है कि), सादे

A.blah(); 

और यहाँ एक उदाहरण है जो इस और अधिक स्पष्ट रूप दिखाता है:

public class A { 
    public static void blah() { System.err.println("I'm an A"); } 
} 

public class SubA extends A { 
    public static void blah() { System.err.println("I'm a SubA"); } 
} 

public class B { 
    public static A getA(){ return new SubA(); } 
} 

B.getA().blah(); //prints "I'm an A". 

... और यह (मुझे आशा है) दिखाता है कि यह दृष्टिकोण ओपी की समस्या का समाधान क्यों नहीं करता है।

2

नहीं, यह संभव नहीं है। आप केवल कक्षा के एक उदाहरण के लिए एक संदर्भ वापस कर सकते हैं। निकटतम आप इसे प्राप्त कर सकते हैं प्रकार क्लास के एक चर के संदर्भ को वापस करने के लिए। सवाल यह है कि आप यह क्यों चाहते हैं? आप कौनसी समस्याएं हल करने की कोशिश कर रहे हैं? एक बेहतर समाधान हो सकता है।

2

भले ही यह संभव हो, लेकिन इसका अधिक उपयोग नहीं किया जाएगा। कॉल A.blah()A का उदाहरण नहीं बनाता है। यह एक स्थिर विधि है जिसमें किसी उदाहरण की आवश्यकता नहीं है।

और आप स्थैतिक तरीकों को लागू करने के लिए इंटरफेस का उपयोग नहीं कर सकते हैं। तो इसके लिए क्या अच्छा होना चाहिए?

6

नहीं, यह संभव नहीं है।

  1. B.getA() एक का एक उदाहरण देता है, और blah() एक गैर स्थिर विधि हो जाएगा: आप दो विकल्प हैं।

  2. सीधे A.blah() पर कॉल करें।

+0

संभव है, लेकिन अनुशंसित नहीं है। यह उत्तर देखें http://stackoverflow.com/questions/1932625/java-return-class-not-an-instance/1933573#1933573 –

+1

वाह। जावा में इस छेड़छाड़ को खोजने के लिए यह आश्चर्यजनक है .. – zedoo

1

आप A का एक उदाहरण नहीं करना चाहते हैं, तो B कॉल blah() सीधे करते हैं। अर्थात।

class B { 
    void blah() { 
     A.blah(); 
    } 
} 
6

मुझे लगता है कि करने के लिए कारण है कि आप इस पूछना जा रहा हूँ कि आप बी अलग व्यवहार के साथ कई अलग अलग वर्गों लौटना चाहते है - न केवल ए

आप शायद के लिए एक इंटरफेस का उपयोग करना चाहते क्या आप इसके बजाय कर रहे हैं।

interface IA { 
    void blah(); 
} 

public class B { 
    IA getA1() { 
    return new IA { 
     void blah() { 
      ...code... 
     } 
    } 
    } 
    IA getA2() { 
    ... 
    } 
    IA getA3() { 
    ... 
    } 
} 

myCallingMethod { 
    B.getA1().blah(); 
    B.getA2().blah(); 
    B.getA3().blah(); 
} 
0

आप प्रतिबिंब का उपयोग करके एक विधि वापस कर सकते हैं जिसे आप बाद में() बाद में आमंत्रित कर सकते हैं। हालांकि, ऐसा लगता है कि आप ऐसा कुछ करने की कोशिश कर रहे हैं जिसे एक और तरीका किया जाना चाहिए। आप ऐसा करने की कोशिश क्यों कर रहे हैं?

4

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

यहां बताया गया है कि आप इसे कैसे कर सकते हैं।

आपके पास एक कक्षा है जो यह करती है।

public class B { 
    Class a 
    public static Class getA(){ 
     return a; 
    } 
} 
तो

blah कॉल करने के लिए कार्य करें:

try{ 
    Method m = B.getA().getDeclaredMethod("blah"); 
    m.invoke(null);//for a static method, you can invoke on null 
} 
Catch(Exception e){ 
    // see documentation for list of exceptions 
} 

तो, क्यों आप ऐसा करना चाहेगा? खैर, अगर आप इसे इस तरह करते हैं तो आप कक्षा ए को बदल सकते हैं तो GetA() ए, बी, सी या डी को वापस कर सकता है, सभी अलग-अलग blah() फ़ंक्शंस के साथ। मुझे सच में यकीन नहीं है कि कौन सा उद्देश्य होगा, लेकिन यदि आप इसे करना चाहते हैं, तो आप कर सकते हैं।

देखें: Class.getDeclaredMethod() और Method.invoke() अधिक जानकारी के लिए।

मैं इस प्रयास नहीं किया है, तो आप कुछ फेरबदल करने की ज़रूरत हो सकती है।

1
public class B { 
    public static A getA(){ return null; } 
} 

B.getA().blah(); //works! 

संपादित

यह सच है कि यह

B.getA(); 
A.blah(); 

के बराबर है सिवाय वे काफी अलग लग रहे हो। कल्पना कीजिए कि आपके पास इनमें से एक श्रृंखला है।

मैंने org.apache.commons.cli.OptionBuilder की जांच की और व्यक्तिगत रूप से मैं ऐसा नहीं करता, लेकिन लेखक का मामला है। एपीआई केवल एक थ्रेड में, एक प्रोग्राम की शुरुआत में उपयोग किया जाता है।

एपीआई डिजाइनरों कभी कभी कुछ जादू चाल बनाने के लिए है, भी अनुमान नहीं है।

public class B { 
    public static A getA(){ return null; } 
} 

B.getA().blah(); //works! 

यह "काम" इस अर्थ में कि आप उम्मीद में एक उपयोगी तरीके से नहीं, लेकिन शायद नहीं, और निश्चित रूप:

+0

+1।-1 सावधानी के एक शब्द को फेंकने के लिए नहीं कि यह नहीं किया जाना चाहिए। बीटीडब्लू, ग्रहण इस कोड को संकलित करते समय इस चेतावनी उत्पन्न करता है 'टाइप ए से स्थिर विधि blah() को स्थिर तरीके से एक्सेस किया जाना चाहिए। –

+0

'org.apache.commons.cli.OptionBuilder' लौटाए गए उदाहरणों पर स्थिर विधियों को कॉल करने के इस विरोधी-पैटर्न का उपयोग करता है। –

+0

यह जावा में एक छेड़छाड़ नहीं है। यह सिर्फ एक उदाहरण है जो ऐसा नहीं कर रहा है जो आपको लगता है कि यह कर रहा है। मेरा जवाब देखें –

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