返回类型的接口

时间:2017-07-03 02:39:07

标签: java interface

我有以下代码:

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的接口方法已实施。在此方法中,PlotterRepositoryPlotterRepository中定义的接口类型。纠正我,如果我错了,并分享你的话,重新怀疑它是如何发生的?

2 个答案:

答案 0 :(得分:2)

repositorySelectorRepositorySelector(或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();
    ...
}