同じパッケージ内のサブクラスとクラスの両方が保護されたフィールドまたはメソッドにアクセスする必要がある特定のユースケースを探しています...
私にとっては、このようなユースケースは具体的というよりも一般的であり、私の好みから生じたものです。
- できるだけ厳密なアクセス修飾子で開始し、必要と思われる場合にのみ、後から弱いものに頼ります。
- 単体テストは、テスト済みコードと同じパッケージに常駐させます。
上記から、デフォルトのアクセス修飾子を使用してオブジェクトの設計を開始できます(最初から開始します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
サブクラスのみの方が簡単ではないでしょうか?正直なところ、長い間、私は行動だという印象の下にあった