Java OSGi导出包含实现代码引用的API安全吗?
假设我实现了以下功能:Java OSGi导出包含实现代码引用的API安全吗?,java,api,export,osgi,Java,Api,Export,Osgi,假设我实现了以下功能: public enum ExportAPIForOSGi { ; public static SpecialObject newSpecialObject() { return new SpecialObjectImplv1(); } } public abstract class SpecialObject { public abstract String specialMethod(String s); } publ
public enum ExportAPIForOSGi {
;
public static SpecialObject newSpecialObject() {
return new SpecialObjectImplv1();
}
}
public abstract class SpecialObject {
public abstract String specialMethod(String s);
}
public class SpecialObjectImplv1 extends SpecialObject {
@Override
public String specialMethod(String s) {
return "33" + s;
}
}
每个类都在自己的单独文件中声明。只有ExportAPIForOSGi
和SpecialObject
才能导出OSGi
我的问题是:导出ExportAPIForOSGi
是否安全,因为它包含对实现代码的显式引用(即SpecialObjectImplv1
)?实现代码是否将被公开
让我们想象一下,稍后,我在
ExportAPIForOSGi
中使用SpecialObjectImplv2
而不是v1?这会成为一个问题吗?您需要导出包含ExportAPIForOSGi和SpecialObject的包,因为它们是您的公共API。SpecialObjectMPLV1应位于另一个未导出的包中。然后,您可以自由更改newSpecialObject的实现以使用另一个impl类,因为该impl类在公共API的签名中不可见。您需要导出包含ExportAPIForOSGi和SpecialObject的包,因为它们是您的公共API。SpecialObjectMPLV1应位于另一个未导出的包中。然后,您可以自由更改newSpecialObject的实现以使用另一个impl类,因为impl类在公共API的签名中不可见。好的,如果您理解得很好,那么只有声明为公共的和出现在公共签名中的内容才是重要的,对吗?如果我100%确定实现代码不会出现在任何声明为公共的文件中(但可能会在类文件中使用),那么我是安全的,对吗?抱歉,我忘记了包含@ToNotify@JVersty,您应该只导出不打算更改的接口/API。这使您可以自由更改实现。如果您更改任何导出的类,您必须卸载使用该模块的每个模块。好的,如果您理解得很好,那么只有声明为公共的和出现在公共签名中的内容才重要,对吗?如果我100%确定实现代码不会出现在任何声明为公共的文件中(但可能会在类文件中使用),那么我是安全的,对吗?抱歉,我忘记了包含@ToNotify@JVersty,您应该只导出不打算更改的接口/API。这使您可以自由更改实现。如果更改任何导出的类,则必须卸载使用该模块的每个模块。