2011-11-22 9 views
6

मेरे पास एक जावा एप्लिकेशन है जो बेस क्लास में दो स्थैतिक ऑब्जेक्ट बनाता है, इन ऑब्जेक्ट्स को प्रोग्राम में पूरे कक्षाओं में संदर्भों की आवश्यकता होती है।संपूर्ण कक्षा में एक वर्ग में बनाए गए स्थिर वस्तु का संदर्भ

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    ... 
    ... 
    ... 
} 

इन वस्तुओं को अन्य निजी वर्गों में स्थानीय निजी चर के रूप में संदर्भित किया जाता है।

public class ClassA{ 
    private ClassB b = Baseclass.B; 

हालांकि, दोनों वस्तु कार्य करने के लिए एक दूसरे को आवश्यकता होती है और अगर मैं अन्य से पहले वस्तुओं में से एक का एक नया उदाहरण बनाता बनाई गई है, "उच्च" कक्षाओं में स्थानीय चर शून्य पर सेट किया गया है। क्या जावा में कोई अवधारणा है जो वस्तु की प्रतिलिपि बनाने के बजाय ऑब्जेक्ट में वास्तविक ऑब्जेक्ट (पॉइंटर की तरह) को संदर्भित करती है?

+4

बारे में बात करें:

public class ClassA{ private ClassB b; public void setB(ClassB b) { this.b = b; } public ClassB getB(ClassB b) { return this.b; } } 

दूसरा उपयोग के लिए एक स्थिर ब्लॉक चर init खराब डिजाइन .. – mre

+0

(Obplead: कृपया, कृपया, कृपया म्यूटेबल स्टेटिक्स (जिसे पहले ग्लोबल्स के नाम से जाना जाता है) का उपयोग न करें। और इसमें सिंगलटन एंटीपाटर का उपयोग करना शामिल है।) –

उत्तर

6

मुझे लगता है कि जो उत्तर आप खोज रहे हैं वह एक "सिंगलटन पैटर्न" है। यह वह जगह है जहां आप अन्य स्थानों में उपयोग के लिए कक्षा का केवल एक उदाहरण बनाते हैं। यहां एक good link to read है। कुछ जावा उदाहरणों के साथ wikipedia page on it यहां है। तब

public class A { 
    private final static A instance = new A(); 

    /* private constructor forces you to use the getInstance() method below */ 
    private A() {} 

    public static A getInstance() { 
     return instance; 
    } 
} 

भी आप एक का एक उदाहरण आप की तरह कुछ करना होगा प्राप्त करना चाहते हैं:

तो अपने कोड कुछ इस तरह दिखेगा

public class B { 
    private final A classA = ClassA.getInstance(); 
    ... 
} 

कोई कारण नहीं क्यों A कर सकता है B का उदाहरण भी नहीं है और B के तरीकों को अपने तरीके से कॉल करें। इस क्रॉस निर्भरता के साथ आप क्या नहीं कर सकते हैं कन्स्ट्रक्टर में किसी अन्य तरीके को कॉल करें।

सामान्य रूप से, इन पैटर्नों का उपयोग कम से कम किया जाना चाहिए। इसे पूरा करने का एक बेहतर तरीका वैश्विक संदर्भों के बजाय निर्भरता इंजेक्शन के माध्यम से है। क्रॉस इंजेक्शन संभव है लेकिन फिर से, इसे कम से कम इस्तेमाल किया जाना चाहिए। कक्षाओं पर निर्भरता रखने के लिए कक्षाओं को दोबारा सुधारने का एक बेहतर समाधान होगा।

वहाँ जावा में किसी भी अवधारणाओं है कि एक चर के रूप में वस्तु के लिए (एक सूचक की तरह) वास्तविक वस्तु का संदर्भ होगा वस्तु की एक प्रतिलिपि बनाने के बजाय है?

जावा लेकिन मूल्य द्वारा पारित किसी भी वस्तु का मूल्य है वस्तु के संदर्भ में (सी में संकेत के समान है, हालांकि वे कर रहे हैं नहीं एक स्मृति पता) है। इसलिए यदि आपके पास A का उदाहरण है और इसे किसी अन्य फ़ील्ड में असाइन करें, तो वह फ़ील्ड वही मान होगा और A के उसी उदाहरण का संदर्भ देगा।

// instantiate a new instance of A 
A a1 = new A(); 
// assign the reference to A to another variable 
a2 = a1; 
// they are equivalent and both reference the same object 
if (a1 == a2) ... 
1

वहाँ जावा में किसी भी अवधारणाओं है कि एक चर के रूप में वस्तु के लिए (एक सूचक की तरह) वास्तविक वस्तु का संदर्भ होगा वस्तु की एक प्रतिलिपि बनाने के बजाय है?

वास्तव में, जावा केवल संदर्भ होते हैं। एक चर कोई ऑब्जेक्ट नहीं हो सकता है, इसलिए वहां कोई चिंता नहीं है।

import static some.package.Baseclass.*; 
+0

मैंने 'निजी क्लासबी' लाइन को वाक्य रचनात्मक रूप से सही बनाने के लिए मूल पोस्ट संपादित किया है। जैसे ही मेरा संपादन वैसे भी स्वीकार हो जाता है ... –

1

जब आप जावा में एक संदर्भ आप वास्तव में एक संदर्भ की एक प्रति बना रहे हैं:

इसके अलावा, बजाय

private ClassB b = Baseclass.B; 

करने का मैं आप समझते हैं एक स्थिर आयात कर सुझाव देंगे । आप अपने उदाहरण में Baseclass.B कॉपी नहीं कर रहे हैं। आप संदर्भ से Baseclass.B पर प्रतिलिपि बना रहे हैं।

आपके द्वारा प्रदत्त उदाहरण कोड में Baseclass.B परिभाषित होने तक शून्य हो जाएगा। यदि आपको b पर कोई ऑपरेशन करने की आवश्यकता है, तो आप इसे ClassA की घोषणा में नहीं कर सकते हैं। आपको इसे किसी विधि में करने की आवश्यकता है जिसे ऑब्जेक्ट a के बाद बुलाया गया है।

0

यह सिंगलटन के लिए एक क्लासिक एप्लिकेशन है।

हर एक के लिए:

  • निर्माता निजी बनाएं।
  • सिंगलटन को पकड़ने के लिए कक्षा के अपने प्रकार के एक निजी स्थिर सदस्य जोड़ें।
  • एक "getThe()" विधि जोड़ें जो उपर्युक्त सदस्य को प्रारंभ करता है यदि यह पहले से सेट नहीं है।

wikipedia:Singleton pattern देखें।

एक निर्माण बी के निर्माता को भी प्राप्त करें() पर।

इसके अलावा, Baseclass में सार्वजनिक फ़ील्ड का उपयोग न करें; इसके बजाय सार्वजनिक गेटर विधियों का उपयोग करें। एक अलग बी चर नहीं रखें; इसके बजाय, इसके लिए एक सिंगलटन से पूछें।

0

वहाँ जावा में किसी भी अवधारणाओं है कि एक चर के रूप में वस्तु को वास्तविक वस्तु (एक सूचक की तरह) का संदर्भ होगा एक प्रति वस्तु के बनाने के बजाय है?

जब आप ऐसा करते:

private ClassB b = Baseclass.B; 

वास्तव में आप एक ही वस्तु पर पोंटिंग रहे हैं एक यह क्योंकि "बी" चर संदर्भ चर नाम पर है है।

अपने प्रश्न के बारे में, मेरी खुलने और कुछ इस तरह करते हैं:

पहले encapsule संदर्भ:

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    static { 
     A.setB(B); 
     B.setA(A); 
    } 
} 
संबंधित मुद्दे