Java9中2個被廢棄的使用方法

語言: CN / TW / HK

背景

在openjdk官網有一些廢棄方法的解釋:

https://cr.openjdk.java.net/~iris/se/9/latestSpec/api/deprecated-list.html

今天介紹用的較多的2種。解決大家被要求做程式碼壞味道整改時不知所以然的問題。

Class.newInstance()方法被棄用

類的例項化有以下6種方式:

用new語句建立物件,這是最常見的建立物件的方法。

  1. 使用Class靜態方法 Class.forName  方法

  2. 使用 .loadClass() 方法

  3. 使用newInstance方法

    運用反射手段,呼叫java.lang.Class的newInstance()例項方法。如:Object obj = Class.forName("java.lang.Object").newInstance();

  4. 呼叫物件的clone()方法。

    無論何時我們呼叫一個物件的clone方法,JVM就會建立一個新的物件,將前面的物件的內容全部拷貝進去,用clone方法建立物件並不會呼叫任何建構函式。要使用clone方法,我們必須先實現Cloneable介面並實現其定義的clone方法

  5. 使用反序列化

  6. 通過I/O流(包括反序列化),如運用反序列化手段,呼叫java.io.ObjectInputStream物件的 readObject()方法。

但是第3種方法Class.newInstance()方法在Java9中被棄用,不過不用擔心有替代方案:

可呼叫Class類的getDeclaredConstructor()方法:檢視getDeclaredConstructor()的原始碼發現,該方法可以傳入類型別的可變引數,應該是根據傳入的引數型別去呼叫相應的構造方法,而以前只能呼叫無參構造器。

咱們先做個試驗:

Version類的構造器要傳入2個引數。例項化方法如下:

如果使用預設的方法進行例項化會丟擲方法不存在異常:

使用Java9推薦的方法可以在編譯期避免問題:

BigDecimal方法被重構

Java9中對BigDecimal做重構,糾正了之前不夠專業的設計,功能並沒有變化。但是會導致兩種被廢棄程式碼。

一種是下面的靜態變數程式設計了列舉:

新列舉中的定義與原來不能說是十分相似,簡直就是一模一樣:

只是位置和名稱不同:

與之對應的,原來是個int型別:

傳參要改成列舉,對應的方法也被廢棄,換成新的:

總結

從以上兩個比較有代表性的廢棄用例中咱們可以看出:用新方式替換是為了規範減少大家犯錯的機率。對新增程式碼做嚴格要求我覺得沒什麼問題。但是很早之前寫好的程式碼要全部改成新方式意義價值就沒有那麼大了。畢竟之前是經過生產長時間驗證的穩定程式碼,變更才是更大的風險。主次還是要分清的。

程式設計一生

因為公眾號平臺更改了推送規則,如果不想錯過內容,記得讀完點一下“在看”,加個“星標”,這樣每次新文章推送才會第一時間出現在你的訂閱列表裡。

想知道自己錯過了哪些更新,可參考我不定期更新的《 系列文章分類彙總 》。