java定义final_Java中何时将方法声明为final的
Java中何時將方法聲明為final的
(2014-01-20 11:21:28)
標簽:
final
it
Java中final關鍵是不像volatile和transient如此神秘,但在程序員心中仍然產生很多疑惑。我經常收到這樣的問題,何時將方法聲明為final的,或何時將方法聲明為static的,后來我在之前的文章中回復了。這樣的問題不是不重要,知道關鍵字的用法只是掌握該功能的一小部分。類似于現實世界中,一個戰士要生存光知道劍能切很多東西是不夠的,需要知道如何使用,更重要的是知道如何有效使用。final關鍵字可以修飾類,方法和變量,對于每一種有不同的意義,但目的是相同的,保持完整性拒絕改變。例如,在Java中final類不可以被繼承,final變量的值不可以修改,final方法不可以被重載。這給你第一個暗示,Java中何時定義一個方法為final的,明顯地是阻止子類修改它的定義,技術上是防止重載。在Java
API中有很多的方法表明如何對方法使用final關鍵字,一個主要的例子是java.lang.Object類,它生命了很多final方法,包括帶有timeout參數的wait方法。另外聲明方法為final的是模板方法,它在模板方法設計模式中修飾了算法。因此,你若是不想令子類改變算法,那就定義為final的來阻止偶然的或惡意的重載。本文你會學到,在Java方法中有效地使用final關鍵字。
Java中的final方法
我從清理代碼中學到的最好的實踐是好的設計,而不是列出一些指南。主要例子是clone()方法,其正確的實現依賴于以下一些準則,而不是由系統保證。通過將Java方法聲明為final的,你不僅表明而且保證沒有人可以修改。對處理安全和重要函數的敏感方法尤其重要。將方法聲明為final的模板方法模式是很好的例子。在模板方法模式中,方法的聲明在一個方法中捕獲,但為了增加實現的靈活性提供了hooks。通過使模板方法final,我們要確保是完全按照每個類中定義的算法步驟,但讓他們靈活地在自己的方法中定義步驟。順便提一下,Java中將類聲明為final的話,系統會自動保證此類的所有方法都不可以被重載,相當于將這些方法都聲明為final的。將一個類聲明為final的也是創建不可變類的重要步驟。
這里有一些指導原則,這可以幫助決定,何時將方法聲明為final的:
1)從構造函數調用的方法應該是final的,否則一個子類可以重寫和修改方法的行為,這可能會導致意外和不良行為。
2)
考慮將性能的關鍵方法聲明為final,這給編譯器更多的機會去優化它。編譯器可以內聯或緩存這些方法,因為他們不能在應用程序的生命周期內改變。雖然現代的JIT甚至能夠內聯非final方法,但是如果他們認為這會導致性能增益并且不會被重載,那么使用final方法在涉及到JIT之前就可以做內聯了。
3) 敏感方法,它們的行為是完全的且不可以被重載,應該聲明為final。
4) 令模板方法final,來使用模板方法設計模式。
總之,將方法聲明為final主要是被設計和安全需求所驅動。雖然性能也作為考慮因素之一,但在當今具有先進的JIT的Java世界中不是主要因素。它也是好的想法,為何你將方法聲明為final的,這對維護你的代碼的開發者有利。還有另外的疑惑是是否將private方法聲明為final的。因為private方法不可以被重載,在不能訪問它的子類中不可以,在可訪問它的內部類中也不可以,因為它們用的是靜態綁定。將private方法聲明為final的不會提供額外的價值。
原文:http://javarevisited.blogspot.com/2013/12/when-to-make-method-final-in-java.html
分享:
喜歡
0
贈金筆
加載中,請稍候......
評論加載中,請稍候...
發評論
登錄名: 密碼: 找回密碼 注冊記住登錄狀態
昵???稱:
評論并轉載此博文
發評論
以上網友發言只代表其個人觀點,不代表新浪網的觀點或立場。
總結
以上是生活随笔為你收集整理的java定义final_Java中何时将方法声明为final的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python计算多次_Python –
- 下一篇: java 字符串排列组合_Java 程序