2011-05-28 36 views
0

讓我們想象一下我執行以下操作:包含對實現代碼的引用的OSGi導出API是否安全?

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; 
    } 
} 

每個類都在它自己單獨的文件中聲明。只有ExportAPIForOSGiSpecialObject將被OSGi導出。

我的問題:是否安全導出ExportAPIForOSGi,因爲它包含對實現代碼的明確引用(即SpecialObjectImplv1)?實施代碼是否會被暴露?

讓我們想象一下,我在ExportAPIForOSGi而不是v1中使用SpecialObjectImplv2?這會成爲一個問題嗎?

回答

3

您需要導出包含ExportAPIForOSGi和SpecialObject的包,因爲它們是您的公共API。 SpecialObjectImplv1應該位於另一個未導出的包中。然後,您可以自由地將newSpecialObject的實現更改爲使用另一個impl類,因爲impl類在公共API的簽名中不可見。

+0

好的,所以如果你理解得很好,那只是公開的,公開簽名中出現的重要的東西,對嗎?如果我100%確定實現代碼沒有出現在公開聲明的任何內容中(但可以在類文件中使用),那麼我是安全的,正確的? – JVerstry 2011-05-28 03:41:44

+0

對不起,我忘了加入@來通知你。 – JVerstry 2011-05-28 04:02:54

+0

@JVersty,你應該只導出你不打算改變的接口/ API。這使您可以自由更改實施。如果更改任何導出的類,則必須卸載使用該模塊的每個模塊。 – 2011-05-28 07:16:16