我有以下代码:
public interface PlotterRepository {
//methods definitions
}
public interface RepositorySelector {
public PlotterRepository getPlotterRepository();
}
public class PlotManager {
static private RepositorySelector repositorySelector;
static public PlotterRepository getPlotterRepository() {
if (repositorySelector == null) {
// few lines of code
}
return repositorySelector.getPlotterRepository();
}
}
public class DefaultRepositorySelector implements RepositorySelector {
final PlotterRepository repository;
public DefaultRepositorySelector(PlotterRepository repository) {
this.repository = repository;
}
public PlotterRepository getPlotterRepository() {
return repository;
}
}
我唯一的问题是repositorySelector.getPlotterRepository()
如何成为PlotterRepository
......的类型?
PlotterRepository = repositorySelector.getPlotterRepository()
在PlotManager
中,RepositorySelector
的接口方法已实施。在此方法中,PlotterRepository
是PlotterRepository
中定义的接口类型。纠正我,如果我错了,并分享你的话,重新怀疑它是如何发生的?
答案 0 :(得分:2)
repositorySelector
是RepositorySelector
(或null
的实例,但我假设if
块的内容将其设置为一些非空值)。调用repositorySelector.getPlotterRepository()
会调用.getPlotterRepository()
定义的RepositorySelector
将返回某种PlotterRepository
实例。
因此repositorySelector.getPlotterRepository()
不会成为 PlotterRepository
,这是返回 a PlotterRepository
的方法。
这是factory pattern的一个例子,有一个"工厂" (RepositorySelector
)可以构造类型(PlotterRepository
)的实例,而不需要知道工厂实际构造所需类型的代码。
在
PlotManager
中,RepositorySelector
的接口方法已实施。
实际上并非如此 - 尽管令人困惑的名称PlotManager.getPlotterRepository()
与RepositorySelector
界面无关(请注意,它不会说implements RepositorySelector
)。
repositorySelector是一个接口,... PlotterRepository只是......只是另一个接口
啊,但是repositorySelector
不是接口:)它是一个变量,指向实现 {{{ 1}}界面(如果它不是RepositorySelector
)。任何实现null
的类都必须定义一个RepositorySelector
方法,这就是所讨论的行中调用的方法 - 该类中定义的方法。
此行为(称为method overriding)是面向对象编程的核心租户,也是Java语言的一个关键特性。
使用getPlotterRepository()
,您可以看到它正在实施DefaultRepositorySelector
,从而实施RepositorySelector
。因此(假设RepositorySelector.getPlotterRepository()
已分配给repositorySelector
块中某处DefaultRepositorySelector
的实例)// few lines of code
将调用该实例的repositorySelector.getPlotterRepository()
方法,并返回getPlotterRepository()
传递给PlotterRepository
的构造函数。
答案 1 :(得分:0)
static private RepositorySelector repositorySelector;
您可能在PlotManager
的构造函数中或者在依赖注入框架中未显示的某些代码通过引用其他类(也未显示)的实例来初始化此变量< em> implements RepositorySelector
。
换句话说,有一个类似于此的类
public class RepositorySelectorImpl implements RepositorySelector {
...
public PlotterRepository getPlotterRepository() {
// do whatever the interface contract says
}
...
}
和(可能)在PlotManager
public PlotManager(...) {
...
PlotManager.repositorySelector = new RepositorySelectorImpl();
...
}