《Effective Java》读书笔记六(方法)
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》读书笔记六(方法)的更多相关文章
- Effective Java 读书笔记之六 方法
一.检查参数的有效性 1.考虑参数有哪些限制,把限制写到文档中,在方法的开头处通过显式地检查来实施这些限制. 二.必要时进行保护性拷贝 1.如果类具有从客户端得到或者返回的可变组件,类就必须考虑保护性 ...
- Effective Java 读书笔记(一):使用静态工厂方法代替构造器
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...
- Effective Java读书笔记——第三章 对于全部对象都通用的方法
第8条:覆盖equals时请遵守通用的约定 设计Object类的目的就是用来覆盖的,它全部的非final方法都是用来被覆盖的(equals.hashcode.clone.finalize)都有通用约定 ...
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- Effective java 读书笔记(2)
第四条:通过私有构造器强化不可实例化的能力 有时可能需要编写只包含静态方法和静态域的类,这样的工具类不希望被实例化,因为实例化对它来说没有意义. 然而,在缺少显式构造器的情况下,系统会自动提供一个缺省 ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条
第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...
- [Effective Java 读书笔记] 第三章类和接口 第十六条
第十六条 复合优先于继承 如果不确定B和A的关系是,is-a的关系,B确实也是A,那么久不应该使用B继承A,否则会暴露实现细节, 你的实现都会限制在原始的实现上. 书中举的第一个例子,实现了一个类ex ...
- [Effective Java 读书笔记] 第三章 对所有对象都通用的方法 第八 ---- 九条
这一章主要讲解Object类中的方法, Object类是所有类的父类,所以它的方法也称得上是所有对象都通用的方法 第八条 覆盖equals时需要遵守的约定 Object中的equals实现,就是直接对 ...
- Effective Java读书笔记--对所有对象都通用的方法
1.覆盖equals请遵守通用规定.不需要覆写equals的场景:a.类的每个实例都是唯一的.b.类不需要提供"逻辑相等"的测试功能.c.超类已经覆盖了equals的方法.d.类是 ...
随机推荐
- jquery文字填写自动高度
下面开始写一个jquery插件 (function($){ $.fn.autoTextarea = function(options) { var defaults={ maxHeight:null, ...
- C#应用视频教程3.4 Halcon+C#测试
有了前面的基础后,我们来测试一下如何把程序做的更通用,首先是把初始化的方法修改一下,在初始化的时候传递过去HTuple这个对象(改成了全局的变量,以便于不同的方法调用) 其次需要有相机打开/相机关 ...
- (C++)UrlEncode的标准实现
http://blog.163.com/xiaopengyan_109/blog/static/149832173201072685539394/ 地址栏传中文参数后是什么编码格式 网页中的表单使用P ...
- Java从零开始学三十六(JAVA IO- 字符流)
一.字符流 BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中 BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的 ...
- eclipse 代码上传github 笔记
第一步 先share project 如图所示 第二步 如果所示 第三步 点击 下面的create 然后点击完成 第四步提交 第五步: 第六步:
- javaweb笔记分享
Lesson 1 一.eclipse工具的使用 1. java代码的位置 1) 选择工作空间 workspace 选择一个文件夹存放程序(代码) 不要用中文和空格 2) 新建一个java 工程(Pr ...
- eclipse/STS 切换目录视图
- Guava学习之Preconditions
在编写程序的时候,很多时候都需要检查输入的参数是否符合我们的需要,比如人的年龄需要大于0,名字不能为空:如果不符合这两个要求,我们将认为这个对象是不合法的,这时候我们需要编写判断这些参数是否合法的函数 ...
- python之模块csv之CSV文件的写入(基本结构)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #CSV文件的写入(基本结构) import csv #csv文件,是一种常用的文本格式,用以存储表格数据,很 ...
- 转:【微信小程序常见问题】下拉框选择器设置picker属性。(包括:城市、日期和时间选择器)
1.picker写法(支持日期Date.时间Time和城市自定义) wxml文件 <picker bindchange="bindPickerChange" value=&q ...