本文主要截图或者代码来自EffectIve Java,所有归属该书作者。
1.泛型的优化
请不要在新的代码中使用原生态类型。
如果使用原生态类型,就失掉了泛型在安全性和表达性方面的所有优势。
一般使用在集合、类(DAO)、方法上。
2.消除非受检警告
Set<Lark> exaltation = new HashSet();会出现警告
----->解决Set<Lark> exaltation = new HashSet<Lark>();
警告的处理方式:
@SuppressWarning("unchecked")来禁止这条警告,不要在类上使用。
3.列表由于数组
修改如下代码:
static <E> reduce(List<E> list,Finction<E> f,E initVal){
List<E> snapshot;
synchronized(list){
snapshot=new ArrayList<E>(list);
}
E result=initVal;
for(E e:snapshot){
result=f.apply(result,e);
return result;
}
}
public class Stack<E>{
private E[] elements;
private int size=0;
public Stack(){
elements =new E[19];//这里有问题
}
public void push(E e){
.....
}
public E pop(){
......
}
}
5.方法
5.1.检查参数是否有效
索引值是否为负数,对象是否为空。
在方法体的开题处,进行参数的检查。
5.2.谨慎设计方法签名
谨慎地选择方法的名称
不要过于追求提供便利的方法
避免过长的参数列表(目标是4个)
5.3.谨慎使用重载
5.4.慎用可变参数
5.5.返回零长度的数组或者集合,而不是null
5.6.为所有导出的API元素编文档注释
6.java异常
1.对可恢复的情况使用受检异常,对编程错误使用运行时异常
java可抛出的结构:受检的异常、运行时异常和错误
在决定使用受检的异常或是未受检的异常时,主要的原则是:如果期望是调用者能够适当地恢复,对于这种情况就应该使用受检的异常。强迫调用者在一个catch子句中处理该异常,或者将它传播出去。
IllegalArgumentException.传递的参数值不合适
IllegalStateException.接受对象的状态而使用调用非法,例如,如果在某个对象被正确地初始化之前,调用者就企图调用这个对象。
NullPointerException,如果调用者在某个不允许null值的参数中传递了null。
IndexOufOfBoundsException,如果调用者在表示序列下标的参数中传递了越界的值。
ConcurrentModificationException,如果一个对象设计为单线程或者与外部同步机制配合使用,一旦发现它正在被并发地修改。
UNsupportedOperationException,如果对象不支持所请求的操作。
2.抛出与抽象想对应的异常。
如果高层的实现在后续的发型版本中发生了变化,它所抛出的异常也可能会跟着发生变化,从而潜在地破坏现有的客户端程序。
为了避免这个问题,更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常。叫做异常转译。
3.对异常建立一个好的文档
4.在细节消息中包含能捕获失败的信息。
为了捕获失败,异常的细节信息应该包含所有“对该异常有贡献”的参数和域的值。
例如:IndexOutOfBoundsException异常的细节消息应该包含下界、上界以及没有落在界内的下标 值。
三种错误,如果指定查找那种错误,就可以极大地加速诊断过程。
堆栈轨迹的用途是与源文件结合起来进行分析,它通过包含抛出该异常的确切文件和行数,以及堆栈中所有其他方法调用所在的文件和行数。
5.努力使失败保持原子性
对于在可变对象上执行操作的方法,获得失败原子性最常见的方法是,在执行操作之前检查参数的有效性。这可以使得在对象的状态被修改之前,先抛出适当的异常。
public Object pop(){
if(size== 0)
throw newEmptyStackException();
Objectresult=elements[--size];
......
}
7.内存泄露的问题:
一般而言,只要类是自己管理内存,程序员就应该警惕内存泄露问题。
一旦元素被释放掉,则该元素中包含的任何对象引用都应该被清空。
内存泄露的另一个常见来源是缓存。
缓存应该时不时地清掉没用的项,这项清除工作可以由一个后台线程(可能是Timer或者是SeheduledThreadPoolExecutor)来完成。或者也可以在给缓存新条目时候顺便进行清理。
内存泄露的第三个常见来源是监听器和其它回调。
内存工具:Head剖析工具。