Effective Java 读书笔记或学习笔记

来源:互联网 发布:淘宝远程付款安全吗 编辑:程序博客网 时间:2024/06/01 20:02

本文主要截图或者代码来自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;}}


4.优先考虑泛型

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剖析工具。







0 0
原创粉丝点击