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的相关推荐

  1. java this final_JAVA中的this,final,surper的用法

    java中的this随处可见,用法也多,现在整理有几点: 1. this是指当前对象自己. 当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用.如下面这个例子中: public ...

  2. int java 声明_怎样用java定义一个int数组 C++ 怎么声明一个整型数组?

    导航:网站首页 > 怎样用java定义一个int数组 C++ 怎么声明一个整型数组? 怎样用java定义一个int数组 C++ 怎么声明一个整型数组? 相关问题: 匿名网友: int[] anA ...

  3. java string.substring 参数,Java,String类中的subString()方法,stringsubstring

    Java,String类中的subString()方法,stringsubstring public class TestStringSubString { // main函数 public stat ...

  4. 43、在java中一个类被声明为final类型,表示了什么意思?

    43.在java中一个类被声明为final类型,表示了什么意思? 表示该类不能被继承,是顶级类. JAVA面试问题及答案大全

  5. java settitle_关于java的JFrame中的setTitle()方法

    展开全部 java的JFrame中使用setTitle()方法设置窗体的标题: 下面是一个计算器的例子: import java.awt.BorderLayout; import java.awt.D ...

  6. java.nio.Buffer 中的 flip()方法

    在Java NIO编程中,对缓冲区操作常常需要使用  java.nio.Buffer中的 flip()方法. Buffer 中的 flip() 方法涉及到 Buffer 中的capacity.posi ...

  7. Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.訪问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一 ...

  8. java 定义xml_java中web.xml定义详解

    1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码. DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用 ...

  9. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object       java.lang.String 所有已实现的接口: Serializable, ...

最新文章

  1. FTP虚拟账户的创建(1)
  2. 用户太多太杂,搞不懂怎么办?“分门别类”将拯救你
  3. mongodb数据库java接口,MongoDB —— 使用Spring Data MongoDB操作数据库
  4. RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总
  5. nginx的 CPU参数worker_processes和worker_cpu_affinity使用说明
  6. 预约直播!抢CSDN纪念卫衣:开源是在为爱发电?
  7. solr 高并发_你真的了解并发编程吗?
  8. 怎么不能锁门_镜子能不能对着床
  9. AE Pixel Sorter 2 for Mac破解教程
  10. Android:异步处理之Handler+Thread的应用(一)
  11. Zookeeper Kafka Debezium Spark 实时数据同步方案在实际项目中的使用
  12. Java 二维码及条形码处理
  13. 写给Python程序员的PHP快速入门教程
  14. 协方差矩阵与PCA原理深入剖析
  15. springboot打成jar后获取resources下文件失败, cannot be resolved to absolute file path because it does not resid
  16. AirVO: An Illumination-Robust Point-Line Visual Odometry阅读
  17. 纯HTML代码绘制表格--初入HTML1
  18. Ubuntu下安装网络电视sopcast
  19. carla的使用方法
  20. 软件数字证书怎么申请

热门文章

  1. a或b search vim_vim编辑器
  2. 用Python3解析html的几种操作方式,你都会用吗?
  3. python基础、print,input,if判断等
  4. python 输出所有大小写字母, range()以及列表切片
  5. powershell共享服务器写文件,Windows PowerShell:共享您的脚本 - 轻松实现
  6. 时钟信号线 电源线 地线_信号线和电源线的区别
  7. C语言socket getsockopt() setsockopt()函数(获取和设置套接口的选项?)
  8. MAKEWORD(2,2)解释
  9. 位bit、字节byte、kb、mb
  10. 使用websockets,后台实时发数据,前台实时接受数据,并集成到Django