您不能在一个类中直接执行此操作,因为以下类的定义由于擦除泛型类型和重复的接口声明而无法编译。
class TwoTypesConsumer implements Consumer<Apple>, Consumer<Tomato> {
// cannot compile
...
}
在一个类中打包相同消耗操作的任何其他解决方案都需要将您的类定义为:
class TwoTypesConsumer { ... }
这毫无意义,因为您需要重复/复制这两个操作的定义,并且不会从接口中引用它们。恕我直言,这样做是一个很小的重复代码,我正努力避免。
这也可能表明一个类中没有太多责任消耗两个不同的对象(如果它们没有耦合)。
但是,我正在做并且可以做的是通过以下方式添加显式工厂对象以创建连接的使用者:
interface ConsumerFactory {
Consumer<Apple> createAppleConsumer();
Consumer<Tomato> createTomatoConsumer();
}
如果实际上这些类型确实是耦合的(相关的),那么我建议以这种方式创建一个实现:
class TwoTypesConsumerFactory {
// shared objects goes here
private class TomatoConsumer implements Consumer<Tomato> {
public void consume(Tomato tomato) {
// you can access shared objects here
}
}
private class AppleConsumer implements Consumer<Apple> {
public void consume(Apple apple) {
// you can access shared objects here
}
}
// It is really important to return generic Consumer<Apple> here
// instead of AppleConsumer. The classes should be rather private.
public Consumer<Apple> createAppleConsumer() {
return new AppleConsumer();
}
// ...and the same here
public Consumer<Tomato> createTomatoConsumer() {
return new TomatoConsumer();
}
}
优点是工厂类知道两种实现,有一个共享状态(如果需要),并且可以在需要时返回更多耦合的使用者。没有重复的消耗方法声明,这些方法不是从接口派生的。
请注意,如果每个消费者都不完全相关,则他们可能是独立的(仍然是私有的)类。
该解决方案的缺点是类的复杂度更高(即使它可以是一个Java文件),并且要访问消费方法,您还需要再调用一次,因此,它不是:
twoTypesConsumer.consume(apple)
twoTypesConsumer.consume(tomato)
你有:
twoTypesConsumerFactory.createAppleConsumer().consume(apple);
twoTypesConsumerFactory.createTomatoConsumer().consume(tomato);
总而言之,您可以使用2个内部类在一个顶级类中定义 2个通用使用者,但是在调用的情况下,您需要首先获得对适当的实现使用者的引用,因为这不能仅仅是一个使用者对象。