एक विशिष्ट उपयोग के मामले की तलाश में जहां एक ही पैकेज के भीतर एक उपवर्ग और एक वर्ग दोनों को एक संरक्षित क्षेत्र या विधि का उपयोग करने की आवश्यकता होती है ...
वैसे मेरे लिए, इस तरह का उपयोग मामला विशिष्ट की बजाय सामान्य है, और यह मेरी प्राथमिकताओं से उपजा है:
- संभव के रूप में सख्त पहुंच संशोधक के साथ शुरू करें, कमजोर एक (एस) का सहारा लेते हुए केवल बाद में आवश्यक समझा।
- यूनिट टेस्ट टेस्ट पैकेज के समान ही होते हैं।
ऊपर से, मैं डिफ़ॉल्ट एक्सेस संशोधक के साथ अपनी वस्तुओं के लिए डिज़ाइन करना शुरू कर सकता हूं (मैं इसके साथ शुरू करूँगा private
लेकिन यह इकाई परीक्षण को जटिल करेगा):
public class Example {
public static void main(String [] args) {
new UnitTest().testDoSomething(new Unit1(), new Unit2());
}
static class Unit1 {
void doSomething() {} // default access
}
static class Unit2 {
void doSomething() {} // default access
}
static class UnitTest {
void testDoSomething(Unit1 unit1, Unit2 unit2) {
unit1.doSomething();
unit2.doSomething();
}
}
}
साइड नोट ऊपर स्निपेट में Unit1
, Unit2
और UnitTest
कर रहे हैं नेस्ट भीतर Example
प्रस्तुति की सादगी के लिए, लेकिन एक वास्तविक परियोजना में, मैं संभावना अलग फ़ाइलों में (और इन कक्षाओं के लिए होता है UnitTest
यहां तक कि एक अलग निर्देशिका में )।
फिर, जब कोई आवश्यकता होती है, तो मैं डिफ़ॉल्ट रूप से अभिगम नियंत्रण को कमजोर कर दूंगा protected
:
public class ExampleEvolved {
public static void main(String [] args) {
new UnitTest().testDoSomething(new Unit1(), new Unit2());
}
static class Unit1 {
protected void doSomething() {} // made protected
}
static class Unit2 {
protected void doSomething() {} // made protected
}
static class UnitTest {
// ---> no changes needed although UnitTest doesn't subclass
// ...and, hey, if I'd have to subclass... which one of Unit1, Unit2?
void testDoSomething(Unit1 unit1, Unit2 unit2) {
unit1.doSomething();
unit2.doSomething();
}
}
}
आप देखते हैं, मैं ExampleEvolved
एक ही पैकेज से संरक्षित तरीकों के सुलभ होने के कारण यूनिट टेस्ट कोड अपरिवर्तित रख सकता हूं , भले ही एक्सेसिंग ऑब्जेक्ट एक उप-वर्ग न हो ।
कम परिवर्तन की आवश्यकता => सुरक्षित संशोधन; आखिरकार मैंने केवल एक्सेस मॉडिफ़ायर को बदल दिया और मैंने क्या तरीकों को संशोधित नहीं किया Unit1.doSomething()
और Unit2.doSomething()
ऐसा किया, इसलिए यूनिट टेस्ट कोड के बिना संशोधनों के साथ जारी रखने की अपेक्षा करना स्वाभाविक है।
protected
यह केवल उपवर्ग है तो क्या यह सरल नहीं होगा ? ईमानदारी से, एक लंबे समय के लिए, मैं इस धारणा के तहत था कि यह व्यवहार है