【问题标题】:pass interface to a class which implements this interface将接口传递给实现该接口的类
【发布时间】:2017-11-23 02:56:20
【问题描述】:

您好,我正在阅读一个项目中的一些代码,我刚开始工作并看到一些类似这样的代码,我无法理解。

public class A implements Ignite {
    protected Ignite ignite;
    .......
    protected void checkIgnite() {
        ......
    }

    @Override 
    public <K, V> IgniteCache<K, V> createCache(CacheConfiguration<K, V> cacheCfg) {
        checkIgnite(); 
        return ignite.createCache(cacheCfg);
    } 

}

我不明白这个类的意思。

首先,这个类A是实现接口Ignite的,那为什么要把接口Ignite传递给这个类呢?

其次,对于A类中的createCache方法,它返回ignite.createCache(cacheCfg),那么这个方法的具体实现是什么?

谢谢!

【问题讨论】:

  • 您阅读了项目中的代码却不明白这一点?我虽然这是你的项目?然后分别寻找包装类委托模式,它可能会为现有功能添加额外的功能。
  • 这门课不是我写的。我正在阅读这门课并试图理解这意味着什么。
  • 看起来像装饰器模式。在 Java 的 IO API 中也做了类似的事情。例如:看看java.io.BufferedReader
  • @anacron 哦,谢谢,这真的很有帮助。

标签: java class interface ignite implements


【解决方案1】:

您的A 类既是Ignite 实例,又是一个Ignite 实例作为字段。
它是一个符合特定接口的包装类。

它提供了一种方法来重用Ignite 实例(它可能是除A 之外的另一个类的实例),同时覆盖它的某些行为。

例如这里:

@Override 
public <K, V> IgniteCache<K, V> createCache(CacheConfiguration<K, V> cacheCfg) {
    checkIgnite(); 
    return ignite.createCache(cacheCfg);
} 

createCache() 实现依赖于包装后的 Ignite 实例的 createCache(),但通过在 checkIgnite() 类的 checkIgnite() 方法之前调用来修改其行为。

【讨论】:

    【解决方案2】:

    看起来有人试图在 Java 8 之前为接口构建默认方法。 当 A 有一个带有 Ignite 参数的构造函数时,你可以这样做:

    IgniteCache<> cache = new A( someIgnite ).createCache( ... );
    

    在 Java 8 中,您可以将 createCache() 作为默认方法直接移动到 Ignite。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您问的是IgniteSpringBean 类。这是与 Spring 集成的包装器。此类封装了正确创建和销毁 Ignite 实例的逻辑。它还检查方法调用时 bean 是否正确配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-20
        • 2012-08-04
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多