我有這樣一類:字段和代碼中的可選類型,是否安全?
class Environment {
somelib.SomeType someOptionalDep = null;
public void doSomething() {
boolean found = false;
try {
Class.forName("somelib.SomeType");
found = true;
} catch (ClassNotFoundException e) {
}
if (found) {
someOptionalDep = new somelib.SomeType();
// ...
}
}
}
somelib
是一個可選包:存在於編譯時,但是從底罐中排除。事實上,這段代碼沒有依賴性(Debian 8上的Oracle Java HotSpot 1.8.0_111),但這真的很安全嗎?
注:我知道,我可以在分離類包裝可選的功能,但是這是對子級在某些情況下,太複雜了。
編輯:
從NoClassDefFoundError
的Oracle文檔:
如果Java虛擬機或
ClassLoader
實例試圖在類的定義中加載時拋出(作爲普通方法的一部分調用或作爲使用new
表達式創建新實例的一部分),並且不能找到該類的定義。當編譯當前正在執行的類時存在搜索到的類定義,但定義無法找到。
不幸的是,它沒有明確聲明關於聲明或已加載但未執行的代碼。
有什麼意義?爲什麼不抓住'NoClassDefFoundError'? – shmosel
是一個可能不存在類型的字段聲明是安全的嗎? –