मैं ऐसी स्थिति में नहीं था जहाँ इन खोजशब्दों के कारण संकलक त्रुटि ने मुझे बग से बचाया हो।
यह इतना के रूप में आवेदन लेखकों को बग से बचाने के लिए इतना नहीं है कि पुस्तकालय लेखकों को यह तय करने दें कि वे अपने कार्यान्वयन के किन हिस्सों को बनाए रखने के लिए प्रतिबद्ध हैं।
अगर मेरे पास एक पुस्तकालय है
class C {
public void foo() { ... }
private void fooHelper() { /* lots of complex code */ }
}
मैं fooकार्यान्वयन को बदलने में सक्षम होना चाहता हूं और संभवतः fooHelperकट्टरपंथी तरीकों से बदल सकता हूं । यदि लोगों के एक समूह ने उपयोग करने का निर्णय लिया हैfooHelper मेरे दस्तावेज़ में सभी चेतावनियों के बावजूद तो मैं ऐसा करने में सक्षम नहीं हो सकता।
privateलाइब्रेरी लेखकों को पुस्तकालयों को प्रबंधनीय आकार के तरीकों (और privateसहायक वर्गों) में इस डर के बिना तोड़ दिया जाता है कि वे वर्षों तक उन आंतरिक विवरणों को बनाए रखने के लिए मजबूर होंगे।
जानकारी को छिपाने के लिए कंपाइलर के लिए क्या सार्थक होगा?
एक तरफ ध्यान दें, जावा privateमें कंपाइलर द्वारा लागू नहीं किया गया है, लेकिन जावा बाइटकोड वेरिफायर द्वारा ।
क्या प्रतिबिंब इस तंत्र को ओवरराइड कर सकता है? जानकारी को छिपाने के लिए कंपाइलर के लिए क्या सार्थक होगा?
जावा में, न केवल प्रतिबिंब इस तंत्र को ओवरराइड कर सकता है। privateजावा में दो प्रकार हैं । उस तरह का privateएक बाहरी वर्ग दूसरे बाहरी वर्ग के privateसदस्यों तक पहुँचने से रोकता है जिसे बायटेकोड वेरिफ़ायर द्वारा चेक किया जाता है, बल्कि privateएक आंतरिक वर्ग द्वारा पैकेज-निजी सिंथेटिक एक्सेसर विधि के माध्यम से उपयोग किया जाता है
public class C {
private int i = 42;
public class B {
public void incr() { ++i; }
}
}
चूंकि क्लास B(वास्तव में नामित C$B) का उपयोग करता है i, संकलक एक सिंथेटिक एक्सेसर विधि बनाता है जो एक तरह Bसे उपयोग करने की अनुमति देता है C.iजो कि बायोटेक वेरिफायर से अतीत हो जाता है। दुर्भाग्य से, चूंकि ClassLoaderआप एक से एक वर्ग बनाने के लिए अनुमति देता है byte[], यह निजी तौर पर प्राप्त करने के लिए काफी सरल है जो Cआंतरिक वर्गों के लिए एक नए वर्ग के Cपैकेज में बनाकर प्रकट होता है जो संभव है यदिC जार को सील नहीं किया गया है।
उचित privateप्रवर्तन को क्लास लोडर, बायटेकोड वेरिफायर और सुरक्षा नीति के बीच समन्वय की आवश्यकता होती है, जो निजी लोगों के लिए चिंतनशील पहुंच को रोक सकती है।
क्या इसका इस्तेमाल किसी वर्ग के गुप्त राज्य पर हमला करने से सुरक्षित करने के लिए किया जा सकता है?
हाँ। "सुरक्षित अपघटन" तब संभव है जब प्रोग्रामर अपने मॉड्यूल की सुरक्षा गुणों को संरक्षित करते हुए सहयोग कर सकते हैं - मुझे अपने मॉड्यूल के सुरक्षा गुणों का उल्लंघन न करने के लिए किसी अन्य कोड मॉड्यूल के लेखक पर भरोसा नहीं करना है।
ऑब्जेक्ट क्षमता भाषा जैसे जो-ई सूचना छिपाने का उपयोग करती है और सुरक्षित अपघटन को संभव बनाने के लिए अन्य साधन:
जो-ई, जावा प्रोग्रामिंग लैंग्वेज का एक सबसेट है जिसे ऑब्जेक्ट-कैपेसिटी अनुशासन के अनुसार सुरक्षित प्रोग्रामिंग को सपोर्ट करने के लिए डिज़ाइन किया गया है। जो-ई का उद्देश्य सुरक्षित प्रणालियों के निर्माण की सुविधा के साथ-साथ जो-ई में निर्मित प्रणालियों की सुरक्षा समीक्षा की सुविधा प्रदान करना है।
उस पृष्ठ से जुड़ा पेपर इस बात का उदाहरण देता है कि privateप्रवर्तन कैसे सुरक्षित अपघटन को संभव बनाता है।
सुरक्षित इनकैप्सुलेशन प्रदान करना।
चित्रा 1. एक परिशिष्ट केवल लॉगिंग सुविधा।
public final class Log {
private final StringBuilder content;
public Log() {
content = new StringBuilder();
}
public void write(String s) {
content.append(s);
}
}
अंजीर पर विचार करें। 1, जो बताता है कि कोई व्यक्ति केवल अपग्रेड लॉग सुविधा कैसे बना सकता है। बशर्ते कि बाकी कार्यक्रम जो-ई में लिखा गया है, एक कोड समीक्षक को that सेंध लगाई जा सकती है कि लॉग एंट्रीज को केवल जोड़ा जा सकता है, और मोडी or एड या हटाया नहीं जा सकता है। यह समीक्षा व्यावहारिक है क्योंकि इसमें केवल Log
कक्षा के निरीक्षण की आवश्यकता होती है, और किसी अन्य कोड की समीक्षा की आवश्यकता नहीं होती है। नतीजतन, इस संपत्ति को सत्यापित करने के लिए लॉगिंग कोड के बारे में केवल स्थानीय तर्क की आवश्यकता होती है।