2012-08-16 17 views
5

मैं main विधि है, जो इस विशेष Application के लिए Application का नया उदाहरण और ApplicationModel, ApplicationView और ApplicationController के उदाहरण बनाता है के साथ निम्नलिखित वर्ग बना लिया है।जावा में किसी अन्य वर्ग से कक्षा का विशिष्ट उदाहरण कैसे प्राप्त करें?

public class Application 
{ 

    // Variables 

    private ApplicationSettings   settings; 
    private ApplicationModel   model; 
    private ApplicationView    view; 
    private ApplicationController  controller; 

    // Constructor 

    public Application() 
    { 
     settings  = new ApplicationSettings(); 
     model   = new ApplicationModel(); 
     view   = new ApplicationView(model); 
     controller  = new ApplicationController(); 
    } 

    // Main method 

    public static void main(String[] args) 
    { 
     Application application = new Application(); 
    } 

    // Getters for settings, model, view, controller for instance of Application 

} 

मुझे पता है, कि वहाँ हमेशा Application का केवल एक अनूठा उदाहरण होगा।

और मैं यह विशेष उदाहरण अपने ApplicationModel, ApplicationView और ApplicationController कक्षाओं में प्राप्त करना चाहता हूं।

यह कैसे संभव है?

उत्तर

6

मैं आवेदन वर्ग पर एक सिंगलटन का प्रयोग करेंगे।

अपना एक और एकमात्र एप्लिकेशन उदाहरण वापस करने के लिए public static विधि डालें।

public class Application 
{ 
    private Application() { } // make your constructor private, so the only war 
           // to access "application" is through singleton pattern 

    private static Application _app; 

    public static Application getSharedApplication() 
    { 
     if (_app == null) 
      _app = new Application(); 
     return _app; 
    } 
} 

आप सिंगलटन डिजाइन पैटर्नhere के बारे में अधिक पढ़ सकते हैं।

हर बार जब आप एक और केवल Application उदाहरण की जरूरत है, आप करते हैं:

Application app = Application.getSharedApplication(); 
+0

यह मेरे लिए एकदम सही समाधान है। आपको बहुत - बहुत धन्यवाद! –

+0

और, शायद, आपने एक टाइपो बनाया है। 'एप्लिकेशन _app' स्थिर होना चाहिए, अगर इसे स्थैतिक विधि से संदर्भित किया गया है।कृपया, इसे सही करें, क्योंकि मुझे यकीन नहीं है। :) –

+1

@EdwardRuchevits: हाँ! यह एक टाइपो नहीं था। मैं बस वहां कीवर्ड डालना भूल गया। यह ** ** ** स्थिर ** होना चाहिए **। –

2

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

Singleton design pattern tutorial

+0

हाँ, यह पूरी तरह से मेरे अनुरूप होगा। धन्यवाद! –

0

मैं इस अभी की कोशिश की, तो आप अन्य वर्गों के लिए Application के निर्माता के भीतर एक निर्माता के रूप में आर्ग this पारित कर सकते हैं (यह मानते हुए मुख्य वर्ग के लिए एक संदर्भ घोषित किया गया है)। इस तरह आप स्पष्ट रूप से Application कक्षा के कई उदाहरण बना सकते हैं। अगर ऐसा है कि आप क्या चाहते ...

+0

मैं 'एप्लिकेशन' का केवल एक उदाहरण बनाना चाहता हूं। वैसे भी, आपके उत्तर के लिए धन्यवाद। –

2

बदलें अपनी Application वर्ग के निर्माता private हो सकता है और ApplicationXxx वर्गों के लिए this वस्तु भेजने के लिए।

private Application() 
{ 
    settings  = new ApplicationSettings(this); 
    model   = new ApplicationModel(this); 
    view   = new ApplicationView(this, model); 
    controller  = new ApplicationController(this); 
} 

आप main विधि के भीतर से Application वर्ग पर new कॉल करने के लिए सक्षम हो जाएगा।

आपका ApplicationSettings, ApplicationModel, ApplicationView और ApplicationController उनके निर्माताओं में एक Application वस्तु लेने के लिए अद्यतन किया जाना चाहिए।

+0

आपके उत्तर के लिए धन्यवाद। मैं इस दृष्टिकोण का उपयोग कर रहा हूं, लेकिन यह वह नहीं था जिसे मैं हासिल करना चाहता था। अब मैं पाब्लो सांता क्रूज़ और एसएमसीजी द्वारा प्रस्तावित सिंगलटन डिजाइन पैटर्न का उपयोग करूंगा। –

+0

@EdwardRuchevits बस यह मत भूलना कि [सिंगलेट्स बुरा हैं] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons)। – maba

1

Application के पैरामीटर को कंपोजिट के रचनाकारों में जोड़ें। जब आप अपने उदाहरण बनाते हैं तो बस this पास करें। उदाहरण के लिए

public class Application { 
    String s = "Setting"; 
    class ApplicationSettings { 
    Application sc; 
    ApplicationSettings(Application sc){ 
     this.sc = sc; 
     System.out.println(sc.s); 
    } 
    } 

    // Variables 

    private ApplicationSettings settings; 

    // Constructor 

    public Application() 
    { 
    settings = new ApplicationSettings(this); 
    } 

    // Main method 

    public static void main(String[] args) 
    { 
    Application application = new Application(); 

    } 

    // Getters for settings, model, view, controller for instance of Application 

} 
+0

मुझे लगता है, सिंगलटन पैटर्न मेरे लिए बेहतर होगा, क्योंकि मुझे अपने 'एप्लिकेशन' का केवल एक उदाहरण चाहिए। लेकिन आपके उत्तर के लिए धन्यवाद! –

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