[英]Is it wrong to use Deprecated methods or classes in Java?
我正在使用 eclipse 開發一個 web 應用程序。 就在今天,我通過更改 JAR 文件更新了我的 struts 版本。 我在某些地方收到警告說方法已被棄用,但代碼運行良好。
我想知道一些事情
在 Java 中使用 Deprecated 方法或類是錯誤的嗎?
如果我不更改任何方法並在出現警告的情況下運行我的應用程序,會不會產生任何性能問題。
1. 在 Java 中使用 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 並發現該功能不再存在時,您不會遇到問題
這沒有錯,只是不推薦。 這通常意味着此時有更好的做事方式,如果您使用新的改進方式,您會做得很好。 一些不推薦使用的東西真的很危險,應該完全避免。 新方法可以比已棄用的方法產生更好的性能,但情況並非總是如此。
您可能聽說過“自嘲式幽默”這個詞。 那是一種將你的重要性最小化的幽默。 不推薦使用的類或方法就是這樣。 它不再重要。 事實上,它是如此不重要,以至於根本不應再使用它,因為它將來可能會不復存在。
盡量避免它
deprecated
方法並不是絕對錯誤的。 對於 Java API 本身,這永遠不會發生,但對於其他任何事情,這意味着它將被刪除。 如果您特別計划不升級(盡管從長遠來看您很可能應該升級)您的軟件的支持庫,那么使用deprecated
方法沒有問題。是的,這是錯誤的。
不推薦使用的方法或類將在 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.