EffectiveJava-6-方法

检查参数的有效性

绝大多数方法和构造器对于传递给它们的参数值都会有某些限制,例如,索引值必须非负数,对象引用不能为null,我们应该在文档中清楚的指明这些限制,并在方法体的开头处检查这些参数,以强制施加这些限制,清楚的抛出适当的异常,以便在发生错误后尽快的检测出错误,例如下面这样:

如果不检查:

1. 可能在处理过程中失败,并产生令人费解的异常

2. 更糟糕的情况是正常返回,但计算出错误的结果

3. 最糟糕的是正常返回,但使得某个对象处于被破坏但状态,在将来某个不确定的时候,某个不想干的点上引发错误

对于某些参数,方法本身没有用到,却被保存起来供以后使用,检验这类参数的有效性尤为重要,构造器就是属于这种情景之一。

例外情况:有些情况下有效性检查工作是非常昂贵的,或是根本不切实际的,或是有效性检查已经隐含在计算过程中完成来。

必要时进行保护性拷贝

假设类的客户端会尽其所能来破坏这个类的约束条件,因此你必须保护性的设计程序;

对于构造器的每个可变参数进行保护性拷贝是必要的 请看下面例子:

下面使用保护性拷贝进行改进:

保护性拷贝会使性能收到一定损失,如果类信任它的客户端不会进行不恰当的修改组件,可以在文档中指明客户端的职责是:不得修改受到影响的组件,以此来代替保护性拷贝。

谨慎设计方法签名

谨慎的选择方法的名称:方法名称应始终遵循标准的命名习惯,1. 应易于理解并与同包中其他方法名称风格一致,2. 应选择与大众认可的名称相一致的名称,如java类库的API;

不要过于追求提供便利的方法:每个方法都应该尽其所能,功能齐全,方法太多会使类难以学习,使用,文档化,测试和维护,会使接口的实现者和用户的工作变得复杂;

避免过长的参数列表:

1. 目标是4个或更少,相同类型的长参数序列格外有害,如margin(int l,int t,int r,int b...),很可能不小心弄错顺序, 而程序仍可编译运行,然而的到错误的结果,缩短参数列表的方法:a. 把方法分分解成多个方法;;b. 创建辅助类;c. 使用建造者模式(builder模式);

2. 对于参数类型,要优先使用接口而不是类,例如,我们经常使用的集合类,应优先使用Map做参数而不是HashMap,优先使用List而不是ArrayList;

3. 对于boolean参数,要优先使用两个元素的枚举类型,更具有易读性,方便编写;

慎用重载

对于重载方法的选择是静态的,对于重写/覆盖方法的选择是动态的,选择被覆盖的方法的版本是在运行时进行的,选择的依据是被调用方法所在对象的运行时类型;

例如下面代码中对问题:想用重载区分传入参数对实际类型,然而结果只是选择了引用声明的类型对应的重载方法:

一个安全而保守的策略是:

1. 永远不要导出两个具有相同参数数目的重载方法(可以给方法起不同的名称而不是使用重载机制),对于可变参数(varargs)不要重载它。例如ObjectOutputStream类的write方法:writeBoolean (boolean) , writeInt(int), writeLong(long), 而不是使用重载;

2. 对于构造器则是应该进了使用静态工厂方法代替重载,或使用builder模式;

3. 如果几个重载方法的参数直接不存在任何关系,如read(int),read(List),read(String[]),当然是可以使用重载的;

4. 自动装箱引发的一个问题,下面程序中的remove,希望去除0,1,2;然而由于自动装箱对Integer对象和int值进行了转换,导致调用了remove不同对重载方法,所以得到了意料外对结果。

慎用可变参数

可变参数方法:可匹配不同长度的变量的方法,接收0或多个指定类型的参数,其机制是通过先创建一个数组, 数组的大小为调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法

可变参数为了printf和反射机制而设计,如printf(String format, Object ... args)

不必改造具有final数组参数的每个方法,只当确实是在数量不定的值上执行调用时才使用可变参数;

缺点:

1. 客户端调用这个方法时可能没有传递参数进去,编译时并不会失败,但可能会造成运行时错误,应进行显示的有效性检查,如args.length==0的情况。

2. 可变参数方法的每次调用都会导致进行一次数组分配和初始化

如果真的需要可变参数的灵活性,可以考虑下面重载的实现方案:

返回零长度的数组或集合,而不是null

若直接返回null,几乎每次用到该方法时都需要额外的代码来处理null的情况,一旦忘记处理就会出错;有人可能觉得返回null避免来分配数组或创建对象的开销,然而

1. 相对于一个可能导致运行时崩溃的定时炸弹,此时担心性能问题是不明智的,

2. 可以用一个私有静态的空数组进行共享,避免每次调用都创建新的对象

3. 可以使用java内置的空集合避免自己创建的开销:

Collections.emptyList(),Collections.emptyMap(),Collections.emptySet();

为所有导出的API元素编写文档注释

为了正确的编写API文档,必须在每个被导出的类,接口,构造器,方法和域声明之前增加一个文档注释,方便用javadoc导出api文档;

方法的文档注释应该简洁的描述出它和客户端之间的约定。

我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号”今阳说“接收我的最新文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 本章讨论方法(构造方法、普通方法)设计的几个方面: 如何处理参数和返回值如何设计方法签名如何为方法编写文档 第38...
    wangcanfeng阅读 353评论 0 0
  • 本文大多数内容适用于构造器,也适用于普通方法,焦点集中在可用性、健壮性和灵活性上。 1.检查参数的有效性 一个原则...
    666真666阅读 233评论 0 3
  • 本章讨论方法设计的几个方面:如何处理参数和返回值?如何设计方法签名?如何为方法编写文档?焦点集中在可用性、健壮性和...
    塞外的风阅读 337评论 0 0
  • 38、检查参数的有效性 绝大多数方法和构造器对于传递给它们的参数值都会有限制。如,对象引用不能为null,数组索引...
    Alent阅读 417评论 0 1
  • 第三十八条、检查参数的有效性 如果传递无效的参数值给方法,这个方法在执行之前应该先对参数进行检查,那么它很快就会失...
    Timorous阅读 181评论 0 0