java - Java中的隐式(继承对象),更适合的方式?

标签 java spring inheritance junit polymorphism

我感觉使用父级的变量有点破旧。它必须是一种强制子类可见性以使其更加明确的方法。

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/

相关文章:

JavaFX程序部署后无法运行python脚本

java - JPA 实体默认构造函数

java - Spring 无法解析 WEB-INF/libs 中的类型

java - 将消息从 ServiceActivator 传递到新的 InboundChannelAdapter

java - Java中的LBYL与EAFP?

java - Shiro 独立应用程序

c++ - 模板基类继承是否有另一种解决方法?

java - 静态嵌套类可以通过非静态扩展

c++ - 是否可以在 using 声明中引用用户定义的转换模板?

java - 我使用Spring+MongoDB,当我执行查询方法时,它抛出java.lang.ClassNotFoundException : com. mongodb.MongoException$DuplicateKey