淺談newInstance()方法和new關鍵字
阿新 • • 發佈:2019-01-26
網上看到了一段工廠類是這麼寫的:
public class SimpleFactory<T> { @SuppressWarnings({ "unchecked", "rawtypes" }) public T getInstance(Class clazz) { try { return (T) clazz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } }
發現這個東西 return (T) clazz.newInstance(); ,就研究了一下。
它們的區別在於建立物件的方式不一樣,前者是使用類載入機制,後者是建立一個新類。
那麼為什麼會有兩種建立物件方式?這主要考慮到軟體的可伸縮、可擴充套件和可重用等軟體設計思想。
我們使用關鍵字new建立一個類的時候,這個類可以沒有被載入。但是使用newInstance()方法的時候,就必須保證:
1、這個類已經載入;2、這個類已經連線了。
newInstance()實際上是把new這個方式分解為兩步,即首先呼叫Class載入方法載入某個類,然後例項化。
這樣分步的好處是顯而易見的。我們可以在呼叫class的靜態載入方法forName時獲得更好的靈活性,提供給了一種降耦(降低耦合度)的手段。
最後用最簡單的描述來區分new關鍵字和newInstance()方法的區別:
* newInstance: 弱型別。低效率。只能呼叫無參構造。
* new: 強型別。相對高效。能呼叫任何public構造。