Auf der Suche nach einem bestimmten Anwendungsfall, bei dem sowohl eine Unterklasse als auch eine Klasse innerhalb desselben Pakets auf ein geschütztes Feld oder eine geschützte Methode zugreifen müssen ...
Für mich ist ein solcher Anwendungsfall eher allgemein als spezifisch und ergibt sich aus meinen Vorlieben für:
- Beginnen Sie mit einem so strengen Zugriffsmodifikator wie möglich, und greifen Sie erst später auf schwächere Modifikatoren zurück, wenn dies als notwendig erachtet wird.
- Unit-Tests befinden sich im selben Paket wie der getestete Code.
Von oben kann ich anfangen, mit Standardzugriffsmodifikatoren für meine Objekte zu entwerfen (ich würde damit beginnen, private
aber das würde den Komponententest erschweren):
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();
}
}
}
Randnotiz im obigen Snippet Unit1
, Unit2
und UnitTest
sind verschachtelt in der Example
Einfachheit der Darstellung, sondern in einem realen Projekt, würde ich wahrscheinlich diese Klassen in separaten Dateien (und habe UnitTest
auch in einem separaten Verzeichnis ).
Wenn dann eine Notwendigkeit entsteht, würde ich die Zugriffskontrolle von Standard auf schwächen 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();
}
}
}
Sie sehen, ich kann Unit-Test-Code behalten ExampleEvolved
unverändert lassen, da geschützte Methoden aus demselben Paket zugänglich sind, obwohl der Zugriff auf das Objekt keine Unterklasse ist .
Weniger Änderungen erforderlich => sicherere Modifikation; Immerhin habe ich nur Zugriffsmodifikatoren geändert und nicht geändert, welche Methoden Unit1.doSomething()
und Unit2.doSomething()
Aktionen ausgeführt wurden. Daher ist es nur natürlich zu erwarten, dass Unit-Test-Code ohne Änderungen weiter ausgeführt wird.
protected
es sich nur um Unterklassen handelt? Ehrlich gesagt hatte ich lange Zeit den Eindruck, dass dies das Verhalten ist