第23条:检查参数的有效性
极大多数方法和构造函数都会对于传递给他们的参数值有某些限制。你应该在文档中清除的指明这些限制,并且在方法体的起始处对参数进行检查,以强迫施加这些限制。
如果一个无效的参数值被传递给一个方法,而这个方法在执行之前首先对参数进行检查,则它很快会失败,并且清除的以一个适当的异常指明错误原因。如果这个方法没有进行参数检查,有可能会发生几种情形。处理过程中失败,并且尝试一个令人迷惑的异常。更差的是,反悔正常,但计算结果是错误的。最糟糕的是,正常返回,但使得对象处于一种被破坏的状态,在某个不确定的时候引发出来错误。
非公有的方法通常应该使用断言来检查他们的参数,而不使用正常的检查语句。如果你使用的开发支持断言,那么你应该使用断言,否则话,你应该使用一种临时的断言机制。
在一个方法执行它的计算任务之前,应该检查它的参数,这条规则也有例外,一个很重要的例外是,在某些情况下,有效性检查工作非常昂贵,或者更本是不且实际的,并且在计算过程中有效性检查工作也被隐含着完成了。
第24条:需要时使用保护性拷贝
假设类的客户尽一切手段来破坏这个类的约束条件,在这样的前提下,你必须保护性的设计程序。编写出一些面对客户的不良行为时仍能保持健壮的类是非常值得投入时间去做的。
public final class Period{
private final Date start;
private final Date end;
public Period(Date start,Date end){
if(start.compareTo(end)>0){
throw new IlleagalArgumentException(start+"after"+end);
this.start=start
this.end=end
}
}
}
但是
Date start=new Date();
Date end=Date();
Period p=new Period(start,end);
end.setYear(78); end被改变了。
对于构造函数的每个可变参数进行保护性拷贝是必要的
public final class Period{
private final Date start;
private final Date end;
public Period(Date start,Date end){
this.start=new Date(start.getTime())
this.end=new Date(end.getTime())
if(start.compareTo(end)>0){
throw new IlleagalArgumentException(start+"after"+end);
}
}
}
保护性拷贝动作是在检查参数的有效性之前进行的,并且有效性检查是针对拷贝之后的对象,而不是原始的对象。参数类型可以被不可信方子类化的情形,请不要使用clone方法进行参数的保护性拷贝。
在把可变参数融入到一个对象内部之前进行保护性拷贝并不总是合适的,对于有些方法和构造函数,他们在被调用的时候,其参数所引用的对象有一个显示的交接过程,当客户调用这样的方法的时候,他承诺以后不在直接修改该对象。
如果一个方法或者构造函数期望接管一个由客户提供的可变对象,那么它必须在文档中明确指明这一点。
第25条:谨慎的设计方法的原型
1.谨慎选择方法名字:
2.不要过于追求提供便利的方法:方法太多会使一个类难以学习,使用,文档化,测试和维护。对于接口而言,这无疑是正确的,接口的方法太多会使接口实现者和接口用户的生活变的复杂化。
3。避免长长的参数列表。通常,三个参数应该被看做实践中的最大值,而且参数越少越好。类型相同的长参数列表尤其有害。用户不仅不能够记住参数的顺序,而且当他们弄错了时候,程序仍然可以运行,只不过不会按照编写程序人的意图。
有2项技术可以缩短太长的参数列表。
1.把一个方法分解成多个方法,每一个方法只要求这些参数的子集。
2.创建铺筑类,用来保存参数的聚集。(创建个类,参数列表作为属性,用于这个参数列表频繁使用)
3.对于参数类型,悠闲使用接口而不是类。
4.谨慎的使用函数对象 (匿名类方式)
第26条:谨慎的使用重载
public class CollectionClassifier{
public static String classify(Set s){
return "Set"
}
public static String classify(List l){
return "List"
}
public static String classify(Collection c){
return "Unknow Collection"
}
public static void main(String[] args){
Collection[] tests=new Collection[]{new HashSet(),new ArrayList(),new HashMap().values()};
for(int i=0;i<tests.length;i++){
System.out.println(classify(tests[i]));
}
}
}
结果是打印三个 unkonw collection
原因:调用哪个重载方法是在编译时刻作出的决定。每次迭代的运行参数类型不同,但这不影响对重载方法的选择。
对于重载方法的选择是静态的,而对于被改写的方法的选择是动态的。
被改写的方法,选择的依据是被调用方法所在对象的运行时类型。
修正重载带来的方案是,用一个方法来替换这三个重载的方法,并且在这个方法中一个显示的instanceof测试。
一个安全而保守的策略是永远不要导出两个具有相同参数数目的重载方法。
重载的函数参数不应该存在父子关系,否则容易引发问题。但是例外的是,他们执行相同的功能,返回相同的结果,则重载不会带来危害,确保这种行为的标准做法是,让更一般化的重载方法把调用转发给更特殊的重载方法。
public int comareTo(Objecto){
return compareTo((String)o);
}
第27条:返回零长度的数组而不是null
因为没有理由要求客户必须有额外的代码来处理null返回值。客户很容易忘记写专门的代码处理null返回值。
nul返回值比零长度数组更好,因为它避免了分配数组所需要的开销,这种观点是站不住脚的,原因有两条,第一,在这个层次上担心性能问题是不明智的,除非分析表明这个方法正式造成性能问题的真正源头。第二,对于不返回任何元素的调用,每次都返回同一个零长度的数组是有可能得,因为零长度是非可变的,而非可变对象有可能被自由的共享。
标准做法:private final static Cheese[] NULL_CHEESE_ARRAY=new Cheese[0];
public Chees[] getCheeses(){
return (Cheese[]) Collection.toArray(Object[]);
}
没有理由从一个取数组的方法中返回null而不是返回一个零长度数组。
第28条:为所有导出的api元素编写文档注释
为了正确的编写api文档,你必须在每一个被导出的类,接口,构造函数,方法和域声明之前增加一个文档注释。
每一个方法的文档注释应该简洁的描述出它和客户之间的约定。这个约定应该说明了这个方法做了什么,而不是说明它是如何完成这项工作的。文档注释应该列举出这个方法所有的前提条件和后置条件,除此之外每个方法也应该在文档中描述它的副作用。
分享到:
相关推荐
数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全...
金蝶实施方法论V10(以下简称“方法论V10”)是金蝶国际软件集团有限公司最新推出的实施方法论。经过不断的发展与优化,金蝶公司致力于为客户提供更加完善的项目管理与实施服务。自2000年以来,金蝶不断迭代更新其...
《数值方法 习题答案》是一份非常全面且详尽的学习资源,主要涵盖了数值方法这一领域的各类习题解答。数值方法是计算机科学、工程学、数学等专业领域中至关重要的一门课程,它研究如何用近似计算来解决那些无法直接...
### 静态(static)方法与重写(override) #### 一、概念解析 在面向对象编程语言中,如Java,方法重写(override)是一种重要的特性,它允许子类提供一个与父类相同签名的方法实现。这种方法的实现允许在运行时...
在易语言中,“取类指针”和“方法指针”是面向对象编程中的关键概念,用于实现对象间的信息交互和方法调用。 1. **取类指针**: 类指针是面向对象编程中的一个重要概念,它代表了一个类实例的地址。在易语言中,...
《数值方法 第二版》是由金一庆、陈越、王冬梅三位知名学者编著的一本关于数值计算的经典教材。这本书深入浅出地介绍了数值分析领域的核心概念、理论和应用,是计算机科学、工程计算、数学等领域学习者的重要参考...
### MATLAB中的谱方法知识点概述 #### 一、引言与背景 在数学和工程领域,谱方法是一种基于函数展开的数值解法,主要用于求解偏微分方程(PDE)和常微分方程(ODE)。MATLAB作为一种强大的计算工具,提供了丰富的库和...
### 预测理论与方法的关键知识点 #### 一、预测的基本概念与重要性 **预测**是指在现有的知识和技术的基础上,对未来的某些情况或事件的发展趋势进行预先判断和估计的过程。这一概念涵盖了多方面的含义,包括预见...
我们知道Android卡顿主要是主线程中有耗时操作导致的,那么我们怎么能方便快捷的获取主线程中的所有耗时方法执行时间呢?今天我们来介绍两个方案 方案一:利用Looper.java中loop()方法的logging.print的特殊关键字...
本文实例讲述了C#定时器实现自动执行的方法。分享给大家供大家参考。具体实现方法如下: 代码如下: //下面讲一个打开窗体定时执行按钮的东西 private void Form1_Load(object sender, EventArgs e) { System.Timers...
【小红书】2024小红书餐饮行业方法论报告.pdf【小红书】2024小红书餐饮行业方法论报告.pdf【小红书】2024小红书餐饮行业方法论报告.pdf【小红书】2024小红书餐饮行业方法论报告.pdf【小红书】2024小红书餐饮行业方法...
数值计算方法是计算机科学与工程领域中的重要学科,它研究如何用近似方法解决数学问题,特别是在实际计算中无法得到精确解的情况下。本资源“数值计算方法答案 1-7章”由曾金平主编,出版于湖南大学出版社,提供了前...
《梁昆淼主编数学物理方法课后习题答案》是一份专为学习数学物理方法的学生和教师准备的重要参考资料。这份资源包含了梁昆淼教授主编的教材中各章节的课后练习题解答,对于深入理解和掌握数学物理方法的核心概念、...
"软件测试方法和技术.zip"这个压缩包很可能包含了一系列关于软件测试的详细资料,涵盖了多种测试方法和技术。以下是对这些关键概念的深入解释。 1. **黑盒测试**:这是一种不考虑内部结构或工作原理,仅关注软件...
《数值方法和MATLAB实现与应用》是一本深入探讨数值计算技术及其在MATLAB环境中的实际应用的专业书籍。这本书旨在帮助读者理解并掌握各种数值计算方法,并通过MATLAB这一强大的科学计算工具进行实践操作。 首先,...
codesys面向对象的方法属性动作接口 codesys面向对象的方法属性动作接口是指在codesys中实现面向对象编程的方法、属性和动作接口。这种接口允许用户在codesys中实现面向对象编程,使用继承、多态和封装等面向对象...
《数值方法(MATLAB版)第四版》是针对科学计算领域的一本重要教材,由电子工业出版社出版,提供了中文版和英文原版两种选择。本书深入浅出地讲解了数值计算的基本理论和实用技巧,结合强大的MATLAB软件,使得学习者...
全书共分十一章,分别介绍了随机模拟方法的特点与步骤、概率论预备知识、Matlab软件的基本编程方法、随机数的生成方法、马尔可夫链蒙特卡罗方法、随机服务系统模型、蒙特卡罗优化方法、随机游走模型、蒙特卡罗积分...
《数学物理方法第三版习题答案》是一份详尽解答了该教材所有习题的参考资料,对于学习数学物理方法的学生来说极具价值。这份资源涵盖了教材中的各种难题和关键概念,旨在帮助学生深入理解和掌握数学物理方法的核心...
复化梯形方法;2.复化辛甫森方法;3.复化高斯方法,求解第二类Fredholm积分方程 高维积分数值计算的蒙特卡罗方法,分别用积分和测度两种不同角度,通过蒙特卡罗方法求冰激凌的体积 病态的线性方程组的求解,选择病态...