Java中new和newInstance的區別

    在Java中,使用new關鍵字和Class.forName("a.class.Name").newInstance都可以創建對象,它們又有什麼區別呢?

    1、類的加載方式不同。
    在執行Class.forName("a.class.Name")時,JVM會在classapth中去找對應的類並加載,這時JVM會執行該類的靜態代碼段。在使用newInstance()方法的時候,必須保證這個類已經加載並且已經連接了,而這可以通過Class的靜態方法forName()來完成的。
    使用關鍵字new創建一個類的時候,這個類可以沒有被加載,一般也不需要該類在classpath中設定,但可能需要通過classlaoder來加載。
    2、所調用的構造方法不盡相同。
    new關鍵字能調用任何構造方法。
    newInstance()只能調用無參構造方法。
    3、執行效率不同。
    new關鍵字是強類型的,效率相對較高。
    newInstance()是弱類型的,效率相對較低。
    既然使用newInstance()構造對象的地方通過new關鍵字也可以創建對象,爲什麼又會使用newInstance()來創建對象呢?
    假設定義了一個接口Door,開始的時候是用木門的,定義爲一個類WoodenDoor,在程序裏就要這樣寫 Door door = new WoodenDoor() 。假設後來生活條件提高,換爲自動門了,定義一個類AutoDoor,這時程序就要改寫爲 Door door = new AutoDoor() 。雖然只是改個標識符,如果這樣的語句特別多,改動還是挺大的。於是出現了工廠模式,所有Door的實例都由DoorFactory提供,這時換一種門的時候,只需要把工廠的生產模式改一下,還是要改一點代碼。
    而如果使用newInstance(),則可以在不改變代碼的情況下,換爲另外一種Door。具體方法是把Door的具體實現類的類名放到配置文件中,通過newInstance()生成實例。這樣,改變另外一種Door的時候,只改配置文件就可以了。示例代碼如下:
String className = 從配置文件讀取Door的具體實現類的類名;
Door door = (Door) Class.forName(className).newInstance();
    再配合依賴注入的方法,就提高了軟件的可伸縮性、可擴展性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章