aynı paket içindeki hem bir alt sınıfın hem de bir sınıfın korunan bir alana veya yönteme erişmek için ihtiyaç duyduğu belirli bir kullanım durumu arıyorsunuz ...
Bana göre, böyle bir kullanım örneği spesifik olmaktan ziyade geneldir ve tercihlerimden kaynaklanıyor:
- Mümkün olduğunca katı erişim değiştiriciyle başlayın, yalnızca daha sonra gerekli görüldüğü gibi daha zayıf olanlara başvurun.
- Birim testlerinin, test edilen kodla aynı pakette bulunmasını sağlayın.
Yukarıdan, varsayılan erişim değiştiricileri ile nesnelerim için tasarlamaya başlayabilirim (ile başlayacağım, private
ancak bu birim testini zorlaştıracaktır):
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();
}
}
}
Yan not Yukarıdaki parçada Unit1
, Unit2
ve UnitTest
vardır yuvalanmış dahilinde Example
sunum basitlik için, ama gerçek bir projede, ben büyük olasılıkla ayrı dosyalarda (ve bu sınıflar olurdu UnitTest
bile ayrı bir dizinde ).
Sonra, bir zorunluluk ortaya çıktığında, erişim denetimini varsayılandan zayıflatabilirim 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();
}
}
}
Gördüğünüz gibi, ExampleEvolved
nesneye erişim bir alt sınıf olmasa da, aynı paketten korunan yöntemlerin erişilebilir olması nedeniyle birim test kodunu değiştirmeden tutabilirim .
Daha az değişiklik gerekli => daha güvenli değişiklik; Sonuçta sadece erişim değiştiricileri değiştirdim ve hangi yöntemleri değiştirmedim Unit1.doSomething()
ve Unit2.doSomething()
yapmadım, bu yüzden birim test kodunun değişiklik yapmadan çalışmaya devam etmesini beklemek doğaldır.
protected
Yalnızca alt sınıf olması daha kolay olmaz mıydı ? Dürüst olmak gerekirse, uzun bir süre boyunca, bu davranış olduğu izlenimi altındaydım