同时支持基于公共接口的API和内部具体的API?

时间:2012-06-29 22:32:55

标签: java api generics

我使用接口设计了一个完整的API,客户端可以使用这些接口来实现某些行为。在内部,我想使用我自己的实现类来使用更丰富的API。我希望这些实现继续符合基于接口的API,但Java对泛型的处理正在阻碍。

以下是一个例子:

public interface PublicAPI {
    void doSomething(SomeType object);
}

public class SomeTypeImpl implements SomeType { }

public class InternalClass implements PublicAPI {
    public void doSomething(SomeTypeImpl object) {
        // ...
    }
}

在某些情况下,可以在公共API中使用通配符(例如<T extends SomeType>)指定类型,但这会导致使用会导致方法冲突的泛型集合。

所以我问你,有没有办法支持这种类型的设计(或更好的设计),或者我注定要在我的内部类和公共API的实现之间来回转换?

谢谢!


更新

我已经更好地理解为什么实际上不可能强制执行比API提供的更具体的类型。一旦有人拥有你的对象的实例,就可以用较少的特定类型对其进行“污染”。

根据ACL建议,我采用了在我自己的特定包中使用内部类的方法,然后使用公共API接口创建它们的“视图”。创建视图后,该对象将标记为不纯,并且无法再保证对象属于除接口之外的任何类型。在我自己的类中,我在处理不纯的对象时抛出异常(因为这意味着允许引用过早泄漏)。

我会将问题留给进一步的见解。

1 个答案:

答案 0 :(得分:1)

为什么不对您的界面进行整合?类似的东西:

public interface PublicAPI<T extends SomeType> {
    void doSomething(T object);
}

顺便说一下,您可以将接口扩展为:

public interface InternalPublicAPI扩展了PublicAPI {        ....在这里添加你的内部方法    }

在Hibernate中有这样的东西,有SessionSessionImplementor接口。