mencari kasus penggunaan tertentu di mana subclass dan kelas dalam paket yang sama perlu mengakses bidang atau metode yang dilindungi ...
Bagi saya, use case semacam itu agak umum daripada spesifik, dan itu berasal dari preferensi saya untuk:
- Mulailah dengan pengubah akses seketat mungkin, menggunakan yang lebih lemah hanya nanti jika dianggap perlu.
- Minta unit test berada dalam paket yang sama dengan kode yang diuji.
Dari atas, saya dapat mulai mendesain objek saya dengan pengubah akses default (saya akan mulai dengan private
tetapi itu akan mempersulit pengujian unit):
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();
}
}
}
Catatan di potongan di atas, Unit1
, Unit2
dan UnitTest
yang bersarang dalam Example
untuk kesederhanaan presentasi, tetapi dalam proyek nyata, saya kemungkinan akan memiliki kelas-kelas dalam file terpisah (dan UnitTest
bahkan dalam direktori terpisah ).
Kemudian, ketika suatu kebutuhan muncul, saya akan melemahkan kontrol akses dari standar menjadi 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();
}
}
}
Anda lihat, saya dapat menjaga kode tes unit ExampleEvolved
tidak berubah karena metode yang dilindungi dapat diakses dari paket yang sama, meskipun mengakses objek bukan sub-kelas .
Lebih sedikit perubahan yang diperlukan => modifikasi yang lebih aman; setelah semua saya mengubah hanya pengubah akses dan saya tidak memodifikasi metode Unit1.doSomething()
dan Unit2.doSomething()
melakukan apa, jadi itu wajar untuk mengharapkan kode tes unit untuk terus berjalan tanpa modifikasi.
protected
hanya subkelas? Jujur, untuk waktu yang lama, saya mendapat kesan bahwa itulah perilaku