No38 检查参数的有效性

对于公有的方法,要用Javadoc的@throws标签(tag)在文档中说明违反参数值时会抛出的异常。这样的异常通常为IllegalArgumentException、IndexOutOfBoundsException或NullPointerException。

/**
* ...
* @throws ArithmeticException if m is less than or equal to 0
*/
public BigInteger mod(BigInteger m) {
if(m.signum() <= 0)
throw new ArithmeticException("Modulus <=0:"+ m);

...//Do the computation
}

对于非公有的方法通常应该使用断言(assertion)来检查它们的参数:

// private helper function for a recursive sort
private static void sort(long a[], int offset, int length){
assert a != null;
assert offset >=0 && offset <= a.length;
assert length >= 0&& length <= a.length – offset; ...// Do the computation
}

断言如果失败,将会抛出AssertionError。

No39 必须时进行保护性拷贝

有经验的程序员通常使用Date.getTime()返回的long基本类型作为内部的时间表示法,而不是使用Date对象引用。主要是因为Date是可变的,它可能被外界调用无意中更改掉而失去它的真实意义。

No40 谨慎设计方法签名

  • 避免过长的参数列表,相同类型的长参数序列格外有害。
  • 对于参数类型,要优先使用接口而不是类。

比如:

// 不合适的方法定义
private void sort(HashMap<String> hashMap); // 合适的方法定义
// 这使你可以传入一个Hashtable、HashMap、TreeMap等等。更改起来很容易。
private void sort(Map<String> map);

No41 慎用重载

下面这个程序的意图是很好的,它试图根据一个集合(collection)是Set、List,还是其他的集合类型来对它进行分类:

// Broken! - What does this program print?
import java.util.*;
import java.math.*; public class CollectionClassifier {
public static String classify(Set<?> s) {
return "Set";
} public static String classify(List<?> lst) {
return "List";
} public static String classify(Collection<?> c) {
return "Unknown Collection";
} public static void main(String[] args) {
Collection<?>[] collections = {
new HashSet<String>(),
new ArrayList<BigInteger>(),
new HashMap<String, String>().values()
}; for (Collection<?> c : collections)
System.out.println(classify(c));
}
}

你可能期望这个程序会打印出“Set”,紧接着是“List”,以及“Unknown Collection”,但实际上不是这样,它是打印“Unknown Collection”三次。

这个程序的行为有悖于常理,因为对于重载方法(overloaded method)的选择是静态的;而对于被覆盖的方法(overridded method)的选择则是静态的。

另外还是注意,在集合的操作中,remove(i)与remove((Integer)i)的含义是不一样的。聪明的你一定知道区别在哪儿了。

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

像下面的方法:

private final List<Cheese> cheeseInStock = ...;

/**
*@return an array containing all of the cheeses in the shop.
* or null if no cheese are available for purchase.
*/
public Cheese[] getCheeses() {
if(cheeseInStock.size() == 0)
return null;
...
}

把没有奶酪(cheese)可买的情况当作是一种特例,这是不全常理的。这样做会要求客户端中必须有额外的代码来处理null返回值。例如:

Cheese[] cheeses = shop.getCheeses();
if(cheeses != null && Arrays.asList(cheeses).contains(Cheese.STILTON))
System.out.println(“Jolly good, just the thing.”);

而不是下面这段代码:

if(Arrays.asList(shop.getCheeses()).contains(Cheese.STILTON))
System.out.println(“Jolly good, just the thing.”);

《Effective Java》读书笔记六(方法)的更多相关文章

  1. Effective Java 读书笔记之六 方法

    一.检查参数的有效性 1.考虑参数有哪些限制,把限制写到文档中,在方法的开头处通过显式地检查来实施这些限制. 二.必要时进行保护性拷贝 1.如果类具有从客户端得到或者返回的可变组件,类就必须考虑保护性 ...

  2. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  3. Effective Java读书笔记——第三章 对于全部对象都通用的方法

    第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定 ...

  4. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  5. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  6. Effective java 读书笔记(2)

    第四条:通过私有构造器强化不可实例化的能力 有时可能需要编写只包含静态方法和静态域的类,这样的工具类不希望被实例化,因为实例化对它来说没有意义. 然而,在缺少显式构造器的情况下,系统会自动提供一个缺省 ...

  7. [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条

    第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...

  8. [Effective Java 读书笔记] 第三章类和接口 第十六条

    第十六条 复合优先于继承 如果不确定B和A的关系是,is-a的关系,B确实也是A,那么久不应该使用B继承A,否则会暴露实现细节, 你的实现都会限制在原始的实现上. 书中举的第一个例子,实现了一个类ex ...

  9. [Effective Java 读书笔记] 第三章 对所有对象都通用的方法 第八 ---- 九条

    这一章主要讲解Object类中的方法, Object类是所有类的父类,所以它的方法也称得上是所有对象都通用的方法 第八条 覆盖equals时需要遵守的约定 Object中的equals实现,就是直接对 ...

  10. Effective Java读书笔记--对所有对象都通用的方法

    1.覆盖equals请遵守通用规定.不需要覆写equals的场景:a.类的每个实例都是唯一的.b.类不需要提供"逻辑相等"的测试功能.c.超类已经覆盖了equals的方法.d.类是 ...

随机推荐

  1. 2014年ENVI/IDL遥感应用与开发培训班-11月重庆站 開始报名了

    主办单位: 中国遥感应用协会 Esri中国信息技术有限公司 内容简单介绍: 依据中国遥感应用协会栾恩杰理事长推动国内遥感技术和应用的指示精神,2014年中国遥感应用协会组织培训交流部与Esri中国信息 ...

  2. Jmeter-Maven-Plugin高级应用:Remote Server Configuration

    Remote Server Configuration Pages 12 Home Adding additional libraries to the classpath Advanced Conf ...

  3. N年的经验在别人眼里是怎么看的?

    很多人简历上都喜欢总结这么一句话:N年XXX领域的经验.N值越大,似乎越NB. 可是,我怎么看到很多人做了几十年的饭,水平变化不大,和专业厨师还是差得远. 还有写一辈子字的,开一辈子车的,这些人也和专 ...

  4. IO介绍

    IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. 比如你打开 ...

  5. Oracle 与 SqlServer 的区别浅析总结

    我主要用过的数据库为Oracle10g和SqlServer2008,通过实际运用和查阅资料整理如下: 主题 Oracle 10g SQLServer 2008 存储过程格式 Create Or Rep ...

  6. HDU4666+POJ2926【最远曼哈顿距离】

    一开始就明白那个N*1<k的算法了, 可无奈删除操作耗时还是太多,最后学习了STL set,map相应的用法,方便好多. STL真的是一个好工具 #include<iostream> ...

  7. uni-app 生命周期

    生命周期分为:页面生命周期和应用生命周期 生命周期可参考:uni-app官方API 注意平台支持,仅某个平台支持会显示,5+App是超HTML5+的App方案. 例如分享:只有小程序支持.这时我们就要 ...

  8. LightOj 1123-Trail Maintenance(最小生成树:神级删边)

    1123 - Trail Maintenance PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  9. SAP SQ01怎样从开发机传输到生产机

    确认你的Query是本地的还是全局的(跨Client).假设是后者,会自己主动生成传输请求,用标准传输方式就可以. 假设是本地的Query,有两种方式: 方式1:复制成全局的,让后生成传输请求 方式2 ...

  10. Debian GNU Linux服务列表的获取、服务的关闭/开启、服务在启动时是否自己主动执行的生效/失效

    /*********************************************************************  * Author  : Samson  * Date   ...