【Java】剖析@Deprecated注解
生活随笔
收集整理的這篇文章主要介紹了
【Java】剖析@Deprecated注解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Before Java9
注解@Deprecated可以標記Java API狀態,表示API已過時和不被推薦使用。
標記原因可以是以下幾種:
- 使用它存在某些風險,可能導致錯誤
- 一個更好和更高效的方案可以取代它
- 在未來版本中可能對其無法兼容地進行更改,或者在將來的版本中將其刪除
使用被 @Deprecated 標記的 API 會被編譯器警告,或者被IDE的語法檢查做黃色的警告。
在Java9之前,有一些早期的設計不是很好的API由于已被廣泛使用,不得不保留下去。頂多是有的API被標記為@Deprecated而不被推薦使用,其實沒有強硬刪除的意味。因為一旦真的刪除某些API,可能會使得使用這些API的程序不兼容或者出現Bug,會帶來很多麻煩事。但這一切都會被Java9顛覆。
而且在Java9之前,@Deprecated都是沒有元素的,但Java9為我們增加了兩個元素。
Since Java9
Java9為注解增加了兩個新元素:since 和 forRemoval。
- since: 元素指定已注解的API元素已被棄用的版本。
- forRemoval: 元素表示注解的 API 元素在將來的版本中被刪除,應該遷移 API。
也就是說,對于被標記為@Deprecated的元素,不遷移該API的使用,可能在JDK版本升級后是不行的。
由于Java9引入了模塊化,所以需要對模塊這部分的@Deprecated做一個說明:
一個被標記@Deprecated的模塊不會影響其中的部分,使用的那些部分如果沒有@Deprecated修飾,就不會被編譯器警告。
使用說明
- 強烈建議在文檔中使用@Deprecated的javadoc標記說明不贊成使用程序元素的原因。 該文檔還應該建議并鏈接到建議的替代API(如果適用)。
替代API的語義通常會有所不同,因此也應討論此類問題,給用戶一個明確的說明。 - 建議為所有新注釋的程序元素都提供一個since值。
這不是強制性的,只是建議。畢竟許多現有的注釋都缺少此元素值(過去大多是Java8,而變化就是在Java8到Java9的路上開始的)。 - 注釋元素之間沒有定義的順序。 按照慣用寫法并參照定義樣式,先寫since后寫forRemoval會比較好。
- 如果存在@Deprecated 的javadoc標記,則@Deprecated注釋應始終存在,反之亦然。
源碼(注釋說明已刪)
package java.lang;import java.lang.annotation.*; import static java.lang.annotation.ElementType.*;/*** @author Neal Gafter* @since 1.5* @jls 9.6.4.6 @Deprecated*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE}) public @interface Deprecated {/*** @return the version string* @since 9*/String since() default "";/*** @return whether the element is subject to removal* @since 9*/boolean forRemoval() default false; }實戰練習
用記事本寫一下代碼——DeprecatedTest.java
class Person {private int id;private String name;@Deprecated(since="1.1")Person(){}Person(int id, String name) {this.id = id;this.name = name;}@Deprecated(since="1.1")public void setId(int id) {this.id = id;}public int getId() {return this.id;}@Deprecated(since="1.1")public void setName(String name) {this.name = name;}public String getName() {return this.name;}}public class DeprecatedTest {public static void main(String[] args) {Person p1 = new Person();p1.setId(1);p1.setName("Sam");Person p2 = new Person(2, "Bob");} }編譯的時候會爆警告的:
獲取一下詳細信息,果然是調用我們標記@Deprecated的API的部分:
總結
以上是生活随笔為你收集整理的【Java】剖析@Deprecated注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】左式堆的Java实现
- 下一篇: 【计算机网络】Quiz集合