簡體   English   中英

在 Java 中使用 Deprecated 方法或類是錯誤的嗎?

[英]Is it wrong to use Deprecated methods or classes in Java?

我正在使用 eclipse 開發一個 web 應用程序。 就在今天,我通過更改 JAR 文件更新了我的 struts 版本。 我在某些地方收到警告說方法已被棄用,但代碼運行良好。

我想知道一些事情

  1. 在 Java 中使用 Deprecated 方法或類是錯誤的嗎?

  2. 如果我不更改任何方法並在出現警告的情況下運行我的應用程序,會不會產生任何性能問題。

1. 在 Java 中使用 Deprecated 方法或類是錯誤的嗎?

deprecated 的定義來看

帶有@Deprecated 注釋的程序元素是不鼓勵程序員使用的,通常是因為它很危險,或者因為存在更好的替代方案。

該方法保留在 API 中以在未指定的時間內向后兼容,並且可能在未來的版本中被刪除。 也就是說,不,它沒有,但有一種更好的方法,它對 API 更改更健壯。

2. 如果我不更改任何方法並在出現警告的情況下運行我的應用程序,會不會產生任何性能問題。

很可能沒有。 它將繼續像棄用之前一樣工作。 API 方法的契約不會改變。 如果某些內部數據結構發生變化以支持新的、更好的方法,則可能會對性能產生影響,但這不太可能。


Java API 中最有趣的棄用是 imo,即FontMetrics.getMaxDecent 棄用原因:拼寫錯誤。

已棄用。 從 JDK 版本 1.1.1 開始,由 getMaxDescent() 取代。

您仍然可以在不改變性能的情況下使用棄用的代碼,但棄用方法/類的全部意義在於讓用戶知道現在有更好的使用方法,並且在未來的版本中可能會刪除棄用的代碼。

術語

來自 Sun 官方詞匯表:

deprecation :指不再推薦的類、接口、構造函數、方法或字段,並且可能在未來版本中不再存在。

從如何以及何時棄用指南:

您可能聽說過“自嘲式幽默”這個詞,或者是將演講者重要性最小化的幽默。 不推薦使用的類或方法就是這樣。 它不再重要。 事實上,您不應再使用它是如此不重要,因為它已被取代並且將來可能不復存在。

@Deprecated注釋更進一步並警告危險:

@Deprecated注釋的程序元素是不鼓勵程序員使用的,通常是因為它很危險,或者因為存在更好的替代方案。

參考


對還是錯?

使用已棄用的方法是對還是錯的問題必須根據個人情況進行檢查。 以下是Effective Java 2nd Edition 中出現“已棄用”一詞的所有引號:

第 7 條:避免終結器:聲稱可以保證終結的唯一方法是System.runFinalizersOnExit及其邪惡的孿生Runtime.runFinalizersOnExit 這些方法存在致命缺陷,已被棄用。

第 66 條:同步訪問共享可變數據:庫提供了Thread.stop方法,但是這個方法很久以前就被棄用了,因為它本質上是不安全的——它的使用會導致數據損壞。

第 70 項:文檔線程安全System.runFinalizersOnExit方法是線程敵對的,已被棄用。

第 73 條:避免線程組:它們允許您一次將某些Thread原語應用於一堆線程。 其中一些原語已被棄用,其余的很少使用。 [...] 線程組已過時。

因此,至少對於上述所有方法,使用它們顯然是錯誤的,至少根據 Josh Bloch 的說法。

使用其他方法,您必須單獨考慮問題,並了解為什么它們被棄用,但一般來說,當棄用決定是合理的時,繼續使用它們將傾向於錯誤而不是正確。

相關問題

除了上面所有出色的響應之外,我發現還有另一個原因要刪除已棄用的 API 調用。

研究為什么不推薦使用調用我經常發現自己在學習有關 Java/API/框架的有趣知識。 一種方法被棄用通常有一個很好的理由,理解這些原因會導致更深入的見解。

所以從學習/成長的角度來看,也是值得的

它當然不會造成性能問題——棄用意味着將來該函數可能不再是庫的一部分,因此您應該避免在新代碼中使用它並更改舊代碼以停止使用它,所以有一天當您升級 struts 並發現該功能不再存在時,您不會遇到問題

這沒有錯,只是不推薦。 這通常意味着此時有更好的做事方式,如果您使用新的改進方式,您會做得很好。 一些不推薦使用的東西真的很危險,應該完全避免。 新方法可以比已棄用的方法產生更好的性能,但情況並非總是如此。

您可能聽說過“自嘲式幽默”這個詞。 那是一種將你的重要性最小化的幽默。 不推薦使用的類或方法就是這樣。 它不再重要。 事實上,它是如此不重要,以至於根本不應再使用它,因為它將來可能會不復存在。

盡量避免它

  1. 通常不,只要您有一個很好的應急計划,可以避免任何問題,如果/當這些方法從您正在使用的庫中消失時,使用deprecated方法並不是絕對錯誤的。 對於 Java API 本身,這永遠不會發生,但對於其他任何事情,這意味着它將被刪除。 如果您特別計划不升級(盡管從長遠來看很可能應該升級)您的軟件的支持庫,那么使用deprecated方法沒有問題。
  2. 不。

是的,這是錯誤的。

不推薦使用的方法或類將在 Java 的未來版本中刪除,不應使用。 在每種情況下,都應該有一個可用的替代方案。 用那個。

在某些情況下,您必須使用已棄用的類或方法來實現項目目標。 在這種情況下,您真的別無選擇,只能使用它。 Java 的未來版本可能會破壞該代碼,但如果這是一個要求,您必須忍受它。 這可能不是您第一次為了滿足項目要求而做錯事,當然也不會是最后一次。

當您升級到新版本的 Java 或其他一些庫時,有時您使用的方法或類會被棄用。 不支持棄用的方法,但不應產生意外結果。 但這並不意味着他們不會,所以盡快切換你的代碼。

棄用過程是為了確保作者有足夠的時間將他們的代碼從舊 API 更改為新 API。 好好利用這段時間。 盡快更改您的代碼。

這並沒有錯,但是在軟件的未來版本中刪除了一些不推薦使用的方法,因此您最終可能會無法使用代碼。

在 Java 中使用已棄用的方法或類是錯誤的嗎?”

沒有錯,但它可以為您節省一些麻煩。 這是一個強烈建議不要使用已棄用方法的示例:

http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

為什么不推薦使用 Thread.stop?

因為它本質上是不安全的。 停止線程會使其解鎖所有已鎖定的監視器。 (當 ThreadDeath 異常沿堆棧向上傳播時,監視器被解鎖。)如果以前受這些監視器保護的任何對象處於不一致狀態,則其他線程現在可以查看處於不一致狀態的這些對象。 據說此類物品已損壞。 當線程對損壞的對象進行操作時,可能會導致任意行為。 這種行為可能很微妙且難以察覺,也可能很明顯。 與其他未經檢查的異常不同,ThreadDeath 會默默地殺死線程; 因此,用戶沒有警告他的程序可能已損壞。 在實際損壞發生后的任何時間,甚至數小時或數天后,損壞都可能出現。


如果不更改任何方法並在出現警告的情況下運行我的應用程序,會不會產生任何性能問題。

性能方面應該沒有問題。 標准 API 旨在尊重一些向后兼容性,因此應用程序可以逐漸適應 Java 的更新版本。

在 Java 中使用 Deprecated 方法或類是錯誤的嗎? 這不是“錯誤”,仍然有效,但要盡可能避免。

假設有一個與方法相關的安全漏洞,並且開發人員確定它是一個設計缺陷。 因此,他們可能會決定棄用該方法並引入新方法。

所以如果你仍然使用舊的方法,你就有了威脅。 因此,請注意棄用的原因並檢查它是否對您有影響。

如果不更改任何方法並在出現警告的情況下運行我的應用程序,會不會產生任何性能問題。

如果棄用是由於性能問題,那么您將遭受性能問題,否則沒有理由出現這樣的問題。 再次想指出的是,要注意棄用的原因。

在 Java 中它是 @Deprecated,在 C# 中它是 [Obsolete]。

我想我更喜歡 C# 的術語。 這只是意味着它已經過時了。 如果您願意,您仍然可以使用它,但可能有更好的方法。

如果您認為 Windows 3.1 已過時,這就像使用 Windows 3.1 而不是 Windows 7。 您仍然可以使用它,但未來版本中可能會有更好的功能,而且未來版本可能會得到支持 - 過時的不會。

Java 的 @Deprecated 也是如此——您仍然可以使用該方法,但風險自負——將來,它可能有更好的替代方案,甚至可能不受支持。

如果您使用的是已棄用的代碼,通常沒問題,只要您不必升級到更新的 API - 已棄用的代碼可能不存在。 我建議如果您看到使用不推薦使用的代碼的內容,請更新以使用較新的替代品(這通常在注釋或 Javadoc 不推薦使用的注釋中指出)。

編輯:正如邁克爾所指出的,如果棄用的原因是由於功能缺陷(或者因為該功能甚至不應該存在),那么顯然,不應使用棄用的代碼。

當然不是 - 因為整個 Java 都被 @Deprecated :-) 只要 Java 存在,你就可以隨意使用它們。 無論如何都不會注意到任何差異,除非它真的壞了。 意思 - 必須閱讀它,然后決定。

然而,在 .Net 中,當某些內容被聲明為 [Obsolete] 時,即使您以前從未使用過它,也請立即閱讀它 - 大約有 50% 的機會它比替換更有效和/或更易於使用:-))

所以總的來說,現在保持技術保守是非常有益的,但你必須先做你的閱讀家務。

我覺得棄用的方法意味着; 有一種替代方法可用,它在所有方面都比現有方法更好。 使用好的方法比現有的舊方法更好。 為了向后兼容,舊方法被棄用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM