मैं ऐसी स्थिति में नहीं था जहाँ इन खोजशब्दों के कारण संकलक त्रुटि ने मुझे बग से बचाया हो।
यह इतना के रूप में आवेदन लेखकों को बग से बचाने के लिए इतना नहीं है कि पुस्तकालय लेखकों को यह तय करने दें कि वे अपने कार्यान्वयन के किन हिस्सों को बनाए रखने के लिए प्रतिबद्ध हैं।
अगर मेरे पास एक पुस्तकालय है
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
कक्षा के निरीक्षण की आवश्यकता होती है, और किसी अन्य कोड की समीक्षा की आवश्यकता नहीं होती है। नतीजतन, इस संपत्ति को सत्यापित करने के लिए लॉगिंग कोड के बारे में केवल स्थानीय तर्क की आवश्यकता होती है।