我感觉使用父级的变量有点破旧。它必须是一种强制子类可见性以使其更加明确的方法。
public abstract class MyClass{
@Autowired
Object implicitObject;
@Test
public void commonTest(){
implicitObject.doSomethingBasic();
}
}
public class MySubClass extends MyClass{
@Test
public void testSomethingElse(){
implicitObject.doSomethingElse();
}
}
您认为这是一个备受推崇的模式吗?有没有最佳选择?
最佳答案
保护 field
暴露父类成员通常不是一个好主意,除非该字段被声明为final(这通常是不可能的),否则它可能会被损坏或hidden由 child 类。 最好通过 getter 方法来保护它。虽然它确实使implicitObject更加“可见”,但它受到了保护,免受“恶意”子类的侵害。
public class MyClass{
@Autowired
private Object implicitObject;
public final Object implicitObject() {return implicitObject;}
}
public class MySubClass extends MyClass{
public void doSomething(){
implicitObject().doSomething();
}
}
这是好的做法吗?
是的,但这取决于implicitObject背后的内容,如果它是某种上下文或资源,那么API对我来说听起来不错。
<小时/>通过访客界面控制访问
如果您想添加更多“约束”,还有另一种解决方案:将隐式对象公开为方法参数,这会为您的隐式对象添加更多“可见性”,但涉及更多样板代码。 (受到访客模式的启发)
/**
* Class to implement for custom tests
* Enable access to low-level implicitObject
*/
public interface CustomTest {
void test(Object implicitObject);
}
public class MyClass{
@Autowired
private Object implicitObject;
@Test
public void commonTest(){
implicitObject.doSomethingBasic();
}
/**
* method that accept the visitor and give access to implicitObject
*/
public final void customTest(CustomTest customTest) {
// You can prepare some stuff before
customTest.test(implicitObject);
// You can cleanup after
}
}
CustomTest 是访问隐式对象的唯一方法:
public class MyCustomTest implements CustomTest {
@Override
public void test(Object implicitObject) {
implicitObject.doSpecificThing();
}
}
然后使用您的访问者实现。
public class MySubClass extends MyClass{
@Test
public void testSomethingElse(){
super.customTest(new MyCustomTest());
}
}
这很冗长......值得付出努力吗?同样,这取决于隐式对象背后的内容。
<小时/>使用您的容器
我不知道 Spring 是否可能/实用,但某些容器应该能够注入(inject)隐式对象作为方法参数。
public abstract class MyClass{
@Autowired
Object implicitObject;
@Test
public void commonTest(){
implicitObject.doSomethingBasic();
}
}
public class MySubClass extends MyClass{
@Test
@Autowired
public void testSomethingElse(Object injectedImplicitObject) {
injectedImplicitObject.doSomethingElse();
}
}
关于java - Java中的隐式(继承对象),更适合的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26626291/