【发布时间】:2019-10-29 04:02:45
【问题描述】:
我有一个 AbstractBaseRepository。我所有的存储库都从这个类扩展。我创建了另一个类 RepositoryFactory 来创建 Repository 的任何实例。由于静态方法的早期绑定,我遇到了问题。
public abstract class AbstractBaseRepository {
public static <T extends AbstractBaseRepository> T getNewInstance(EntityManagerFactory entityManagerFactory) {
throw new RuntimeException("Override and provide valid initialization");
}
...
}
public class RepositoryFactory {
public static <T extends AbstractBaseRepository> T getRepository(Class<T> cls) {
return T.getNewInstance(entityManagerFactory);
}
...
}
一个示例子类
public class DeviceModelRepo extends AbstractBaseRepository {
public static DeviceModelRepo getNewInstance(EntityManagerFactory entityManagerFactory) {
return new DeviceModelRepo(entityManagerFactory);
}
...
}
每当我使用 AbstractBaseRepository 的有效子类调用 getRepository() 时,都会引发运行时异常。这是由于静态方法的早期绑定。在编译期间,getNewInstance 与 AbstractBaseRepository 绑定,而不是在运行时与类的实际类型绑定。有什么好的解决方法吗?
【问题讨论】:
-
提前绑定静态方法,不要使用static,使用正确的
@Override注解? -
看起来,您正试图覆盖子类中的静态方法,但静态方法永远不会被覆盖。如果您尝试在子类中执行,它将隐藏父静态方法,并且在您调用它的任何类上,它都会调用该类方法。如果要覆盖该方法,请从中删除 static 关键字。
-
@BagusTesa 如果我使用实例方法并覆盖,我不需要为每个 Repository 单独的 RepositoryFactory 吗?
-
@AshokPrajapati 如果我删除 static 关键字,我的 RepositoryFactory 将无法初始化实例。我将不得不为每个 Repository 提供单独的 RepositoryFactory
-
嗨@SaikatDey,Ashok Prajapati 的意思大致是这样的:repl.it/repls/LiveDotingSlope 看看如何将变量影响你调用的静态方法。这就是为什么我们建议使用适当的覆盖方法(或者只是找到一个不错的 DI 库来解决您的问题)..
标签: java static-binding