2012-06-01 19 views
6

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

public class Box { 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p){ 
     prv = p; 
    } 

    public void changeValue(){ 
     prv.increment(); 

    } 

} 


public class PrivateObject { 
    private value; 
    public increment(){ 
     value++; 
    } 

} 

PrivateObject priv = new PrivateObject(); 
Box box = new Box(); 
box.setPPrivateObject(priv); 
box.changevalue(); 
priv.increment(); //i dont want it to be changable outside the Box class! 

सी ++ में, मैं सभी PrivateObject गुण और विधियों निजी बनाना होगा, और PrivateObject वर्ग के लिए एक मित्र के रूप में बॉक्स वर्ग घोषणा करते हैं।

+1

संबंधित प्रश्न http://stackoverflow.com/questions/182278/is-there-a-way-to-simulate-the-c-friend-concept-in-java –

उत्तर

3

यदि PrivateObjectBox से दृढ़ता से संबंधित है तो इसे Box के अंदर एक आंतरिक कक्षा क्यों न बनाएं?

class Box { 

    public static class PrivateObject { 
     private value; 

     private increment(){ 
     value++; 
     } 
    } 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p){ 
     prv = p; 
    } 

    public void changeValue(){ 
     prv.increment(); 
    }  
} 

अब तुम बाहर Box से increment फोन नहीं कर सकते हैं:

public static void main(String args[]) { 
    Box.PrivateObject obj = new Box.PrivateObject(); 
    Box b = new Box(); 
    b.setPrivateObject(obj); 
    obj.increment(); // not visible  
} 
3

निकटतम PrivateObject बॉक्स के एक आंतरिक वर्ग बनाने के लिए और increment निजी बनाने के लिए किया जाएगा। इस तरह, विधि केवल Box कक्षा के भीतर पहुंच योग्य होगी।

public class Box { 

    private PrivateObject prv; 

    public void setPrivateObject(PrivateObject p) { 
     prv = p; 
    } 

    public void changeValue() { 
     prv.increment(); 

    } 

    public static class PrivateObject { 

     private int value; 

     private void increment() { 
      value++; 
     } 
    } 
} 

आप ऐसा नहीं करना चाहते हैं, तो अगले विकल्प increment पैकेज निजी बनाने के लिए और एक ही पैकेज में 2 कक्षाएं लगाने के लिए किया जाएगा। इस तरह, उस पैकेज के भीतर केवल कक्षाओं को उस विधि तक पहुंच होगी। लेकिन इसमें बॉक्स के अलावा अन्य वर्ग शामिल हो सकते हैं।

3

जावा में सी ++ के मित्र कीवर्ड के बराबर कोई भाषा सुविधा नहीं है।

  1. पैकेज निजी के रूप में PrivateObject वर्ग के increment() प्रणाली की घोषणा और एक ही पैकेज में बॉक्स को परिभाषित: हालांकि, वहाँ अनुप्रयोग स्तर विकल्प की संख्या में हैं। अगर इस टोकन वास्तव में Box वर्ग से आने वाले और अनुमति देते हैं या नामंज़ूर है इस विधि की जांच के अंदर -

या

2.Let बुला कोड increment() में एक टोकन गुजरती हैं।

विचार PrivateObject और Box कक्षा प्रबंधन के बीच युग्मन को रखना है।

1

जावा में, आप एक ही पैकेज में एकाधिक कक्षाओं को डालकर "दोस्तों" का एक समूह बनायेंगे। फिर, उन वर्गों, विधियों और फ़ील्ड पर डिफ़ॉल्ट दायरे (कोई एक्सेस विनिर्देशक) का उपयोग करें, जिन्हें आप प्रतिबंधित करना चाहते हैं।

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