【Java】剖析@Deprecated注解
Before Java9
注解@Deprecated可以標(biāo)記Java API狀態(tài),表示API已過時(shí)和不被推薦使用。
標(biāo)記原因可以是以下幾種:
- 使用它存在某些風(fēng)險(xiǎn),可能導(dǎo)致錯(cuò)誤
- 一個(gè)更好和更高效的方案可以取代它
- 在未來(lái)版本中可能對(duì)其無(wú)法兼容地進(jìn)行更改,或者在將來(lái)的版本中將其刪除
使用被 @Deprecated 標(biāo)記的 API 會(huì)被編譯器警告,或者被IDE的語(yǔ)法檢查做黃色的警告。
在Java9之前,有一些早期的設(shè)計(jì)不是很好的API由于已被廣泛使用,不得不保留下去。頂多是有的API被標(biāo)記為@Deprecated而不被推薦使用,其實(shí)沒有強(qiáng)硬刪除的意味。因?yàn)橐坏┱娴膭h除某些API,可能會(huì)使得使用這些API的程序不兼容或者出現(xiàn)Bug,會(huì)帶來(lái)很多麻煩事。但這一切都會(huì)被Java9顛覆。
而且在Java9之前,@Deprecated都是沒有元素的,但Java9為我們?cè)黾恿藘蓚€(gè)元素。
Since Java9
Java9為注解增加了兩個(gè)新元素:since 和 forRemoval。
- since: 元素指定已注解的API元素已被棄用的版本。
- forRemoval: 元素表示注解的 API 元素在將來(lái)的版本中被刪除,應(yīng)該遷移 API。
也就是說(shuō),對(duì)于被標(biāo)記為@Deprecated的元素,不遷移該API的使用,可能在JDK版本升級(jí)后是不行的。
由于Java9引入了模塊化,所以需要對(duì)模塊這部分的@Deprecated做一個(gè)說(shuō)明:
一個(gè)被標(biāo)記@Deprecated的模塊不會(huì)影響其中的部分,使用的那些部分如果沒有@Deprecated修飾,就不會(huì)被編譯器警告。
使用說(shuō)明
- 強(qiáng)烈建議在文檔中使用@Deprecated的javadoc標(biāo)記說(shuō)明不贊成使用程序元素的原因。 該文檔還應(yīng)該建議并鏈接到建議的替代API(如果適用)。
替代API的語(yǔ)義通常會(huì)有所不同,因此也應(yīng)討論此類問題,給用戶一個(gè)明確的說(shuō)明。 - 建議為所有新注釋的程序元素都提供一個(gè)since值。
這不是強(qiáng)制性的,只是建議。畢竟許多現(xiàn)有的注釋都缺少此元素值(過去大多是Java8,而變化就是在Java8到Java9的路上開始的)。 - 注釋元素之間沒有定義的順序。 按照慣用寫法并參照定義樣式,先寫since后寫forRemoval會(huì)比較好。
- 如果存在@Deprecated 的javadoc標(biāo)記,則@Deprecated注釋應(yīng)始終存在,反之亦然。
源碼(注釋說(shuō)明已刪)
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; }實(shí)戰(zhàn)練習(xí)
用記事本寫一下代碼——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");} }編譯的時(shí)候會(huì)爆警告的:
獲取一下詳細(xì)信息,果然是調(diào)用我們標(biāo)記@Deprecated的API的部分:
總結(jié)
以上是生活随笔為你收集整理的【Java】剖析@Deprecated注解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】左式堆的Java实现
- 下一篇: java美元兑换,(Java实现) 美元