日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

【Java】剖析@Deprecated注解

發(fā)布時(shí)間:2025/3/15 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】剖析@Deprecated注解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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的部分:

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的【Java】剖析@Deprecated注解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。