Java - OOP - 在编译期间强制执行特定的实现

时间:2018-06-11 07:51:13

标签: java oop

我的代码有一组"工厂" (IfaceProducerProcessor)生成相同接口(Iface)的不同内部实现。这些工厂也应该能够稍后对他们生成的实例执行某些处理,但不能在Iface的其他实现上执行。

毋庸置疑,调用代码不应该知道特定Iface实例的实现细节或内部接口,只是它应该将其单独传递给原始生成器进行处理。

如何强制只将相同的具体类传递给生成它的类?泛型可能吗?

interface Iface {
    void foo();
}

interface IfaceProducerProcessor {
    Iface produceIface();
    void processIface(Iface iface);
}

class A implements IfaceProducerProcessor {
    Iface produceIface() {
        return new AIfaceImpl();
    }

    void processIface(Iface iface) {
        // How to enforce AIfaceImpl in compile-time?
        if (!(iface instanceof AIfaceImpl)) {
            throw IlleagalArgumentException("Expected instanceof AIfaceImpl.");
        }

        ...

        ((AIfaceImpl)iface).bar();

        ...
    }

    class AIfaceImpl implements Iface {
        // implementation of foo() ...

        void bar() {

        }
    }
}

class B implements IfaceProducerProcessor {

    ...

    class BIfaceImpl implements Iface {

        ...

    }
}

...

如果很明显我有设计缺陷,我会很高兴听到它是什么以及如何纠正它,但请记住,这是我的代码的简化示例,以及我可以提供的具体细节。让我进入给定的设计...

1 个答案:

答案 0 :(得分:2)

您对泛型的猜测可能效果最佳,请考虑更改IfaceProducerProcessor。请注意通用参数I,该参数仅适用于Iface的实现:

interface IfaceProducerProcessor<I extends Iface> {
    I produceIface();
    void processIface(I iface);
}

然后类A使用以下定义实现:

class A implements IfaceProducerProcessor<AIfaceImpl>{
     public AIfaceImpl produceIface(){
         /* ... */
     }

     public void processIface(AIfaceImpl iface){
         /* ... */
     }
}

通过编译器,您只需要在此特定AIfaceImpl中使用IfaceProducerProcessor

然后可以对IfaceProducerProcessor的每个实现进行相同的操作:

class B implements IfaceProducerProcessor<BIfaceImpl>{
    /* ... */
}

等等。

相关问题