把好方法参数的大门

做编程工作这几年来,见识了不少烂代码,最常见的就是像下面那样的:

public void execute(Args args){

//方法体内对args没有作任何检查,直接使用执行。

}

所有的参数都从Args对象中取,多的时候大概有十几个参数,而在方法体内,直接使用参数,对参数没有作任何检查,大家可以想象一下调用这样的方法有多痛苦,经常执行到中途报一个错误,修改对参数后又抛出另一个异常,查了很久发现是另一个参数传错了,我说你不仅偷懒不写注释,连最基本的参数有效性检查都不做,这种方法写出来简直是对使用者的慢性谋杀啊。

一个方法该怎么写,看下基本类的源码就知道了。如String类的方法:

/**
     * @param      index   the index of the <code>char</code> value.
     * @return     the <code>char</code> value at the specified index of this string.
     *             The first <code>char</code> value is at index <code>0</code>.
     * @exception  IndexOutOfBoundsException  if the <code>index</code>
     *             argument is negative or not less than the length of this
     *             string.
     */
public char charAt(int index) {
 if ((index < 0) || (index >= value.length)) {
 throw new StringIndexOutOfBoundsException(index);
   }
 return value[index];
}

虽然有时候一些不懂编程的人对程序员的时间压得比较紧,我们没有足够时间去写这么完整的注释,但是在方法执行前对参数进行检查一般是必须的

if ((index < 0) || (index >= value.length)) {

throw new StringIndexOutOfBoundsException(index);

}

不做检查有什么后果:

1、有可能代码执行到中途报出一个令人困惑的bug,而这个bug通过参数有效性检查是很容易被排查解决的。

2、方法可以正常返回,返回值却是错误的

3、最糟糕的是,方法返回值正确,其中的一些对象状态却被侵入,这增加程序运行的不确定性,并在未来以一个难以排查的bug的形式表现出来。

对于公共方法,需要添加 @throws,@exception 这样的标记,对异常进行文档化,对于私有方法,由于你可以控制方法被调用的环境,你应该确保只有正确的参数被传入,可以使用断言assert。

private static void group(int[] a) {
 assert a != null;
 // Do the computation
}

断言是开发期间使用的,让程序在运行期间进行自检的代码,建议用来处理绝不应该发生的情况,如果检查失败,他会报AssertionError,在开发期间,你开启断言功能,排查相互矛盾的假定,例外情况和错误的数据,在上线时,关闭断言功能,以免降低系统性能。(java中,断言可以通过-enableassertions标记开启)。

原文发布于微信公众号 - java达人(drjava)

原文发表时间:2016-03-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏熊二哥

GOF设计模式快速学习

这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了。为了和"学习"之间的友谊小船不翻,决定对以往学习过的G...

1989
来自专栏技术小黑屋

你的Java代码对JIT编译友好么?

本文为 InfoQ 中文站特供稿件,首发地址为:你的Java代码对JIT编译友好么?。如需转载,请与 InfoQ 中文站联系。

2562
来自专栏高性能服务器开发

后台开发面试问题总结

今天看了几篇关于后台开发的面试经验贴,感受到了来自面试官的满满恶意。 主要考察领域:

4272
来自专栏数据小魔方

R语言多任务处理与并行运算包——foreach

相信大部分R语言初学者,在刚开始入门之处,都曾被告诫在处理多重复任务时,尽量不要使用显式的for循环,而要尽可能的使用R语言内置的apply组函数,这样可以极大...

43011
来自专栏机器之心

资源 | 简单快捷的数据处理,数据科学需要注意的命令行

1645
来自专栏PPV课数据科学社区

工具 | 如何在Python中调用R语言包?

R语言是非常强大的做统计分析和建模方面的开源软件,它有非常丰富的统计软件包,做统计可以说只有你想不到的,没有R办不到的。Python又是当下最流行的编程软件之一...

9528
来自专栏Java3y

【Java】几道让你拿offer的面试题

之前在刷博客的时候,发现一些写得比较好的博客都会默默收藏起来。最近在查阅补漏,有的知识点比较重要的,但是在之前的博客中还没有写到,于是趁着闲整理一下。

3110
来自专栏海天一树

NOIP 2010普及组初赛C/C++答案详解

1 D 2E + 03 = 2 * 103 = 2000 2E - 03 = 2 * 1 / (2 * 103) = 2 * 0.001 = 0.002

811
来自专栏FreeBuf

逆向工厂(二):静态分析技术

* 本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可禁止转载 前言 [逆向工厂]第一章节中介绍了逆向技术的相关基础知识,其中提到逆向的两种形式:...

4188
来自专栏量化投资与机器学习

【干货】Matlab的内存问题讨论

谢谢大家支持,可以让有兴趣的人关注这个公众号。让知识传播的更加富有活力,谢谢各位读者。 很多人问我为什么每次的头像是奥黛丽赫本,我只能说她是我女神,每天看看女神...

2018

扫码关注云+社区