文章目录
  1. Effective Java 2th Part I
    1. 创建与销毁对象
    2. 对于所有对象都通用的方法
    3. 类和接口

Effective Java 2th Part I

创建与销毁对象

1、静态工厂代替构造器
优点:

  • 命名:方法名称表示对象含义
  • 复用:不需要每次都创建新对象
  • 返回子类对象:可以返回该类的子类对象
  • 创建参数化类型对象简洁:new HashMap>().
    缺点:
  • 没有默认或保护的构造方法无法子类化
  • 只是一个静态方法而不像构造函数有明确的语法含义

2、多个构造参数考虑使用构造器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class App{
private int p1;
private int p2;
private int p3;
private int p4;
private int p5;
public static class Builder{
private int p1=0;
private int p2=0;
private int p3=0;
private int p4=0;
private int p5=0;
public Builder(int p1,int p2){
this.p1=p1;
this.p2=p2;
}
public Builder setP3(int p3){
this.p3=p3;
return this;
}
public Builder setP4(int p4){
this.p4=p4;
return this;
}
public Builder setP5(int p5){
this.p5=p5;
return this;
}
public App build(){
return new App(this);
}
}
public App(Builder builder){
p1=builder.p1;
p2=builder.p2;
p3=builder.p3;
p4=builder.p4;
p5=builder.p5;
}
}
//client
App app=new App.Builder(1,2).setP3(3).setP4(4).setP5(5).build();

优点:

  • 灵活
  • 具名
  • 安全
    缺点:
  • 需要创建构造器,性能开销

3、私有构造器强化单例属性

  • 见单例模式
  • 唯一元素的枚举类也是一种单例的最好方法

4、私有构造函数使得某些类不可实例化(工具类等)

5、不要创建多余的对象

  • 避免频繁使用装箱基本类型
    1
    2
    3
    4
    Long s=0L;
    for(long i=0;i<100000;i++){
    s+=i;//warning!每次都创建一个Long对象
    }

6、消除过期的对象引用

  • 如果类自己管理内存,注意内存泄漏,比如自己实现的堆栈
  • 缓存要注意清理问题
  • 监听器与回调

7、避免使用终结方法

对于所有对象都通用的方法

8、覆盖equals方法注意:

  • 自反性、对称性、传递性、一致性、非空性(x.equals(null)==false)
  • 使用instanceof检查参数是否为正确类型
  • 注意方法的入参类型是Object,否则是重载
  • ==比较不是float与double的基本类型,引用使用equals,float使用Float.compare(),double使用Double.compare()

9、覆盖equals时候始终覆盖hashcode

  • 否则影响hash

10、始终覆盖toString()

11、谨慎实现cloneable接口

  • 一般不要实现,否则需要提供良好的实现,深度拷贝与同步

12、考虑实现comparable接口

  • 获得更多的内置集合功能,如排序等

类和接口

13、使类和成员的可访问性最小化

  • 封装

14、访问属性使用访问方法而不是直接访问

  • 私有的嵌套类可以直接访问,危害性较小

15、尽量使用不可变性

  • 线程安全,内部信息共享,提供大量构件

16、使用复合而不是继承

  • 复合和转发机制(装饰器模式)
  • 只有在is-a关系时使用继承

17、要么为继承而设计,要么禁止继承

  • 需要提供详细的文档说明
  • 好的API文档描述一个操作做了什么,而不是如何做的
  • 如果允许继承,构造器不可以调用可覆盖的方法

18、接口优于抽象类

  • 接口利于实现混合类型(某个类具有某种特定的功能,如Comparable接口)
  • 利于实现非层次的类结构,比如歌唱家与作家接口
  • 一般导出接口的骨架实现抽象类或简单实现(用于直接使用或继承)
  • 抽象类对比接口更容易演变
  • 公开接口一旦发布,几乎无法修改,建议同时发布骨架抽象类

19、接口只用于定义类型

  • 导出常量使用枚举,而不是包含一堆static final变量

20、类层次优于标签类

  • 不要在一个类中完成相似而又不同的多套逻辑(三角形与原形面积计算,一个类中使用switch类的逻辑判断)
  • 针对相似而不同的逻辑关系,考虑拆成子类父类的类层次关系

21、用函数对象标识策略

  • 策略模式

22、优先考虑静态成员类

  • 非静态的嵌套类每个实例都会持有一个外围类的引用
  • 如果嵌套类不需要外围实例的引用,就使用静态,否则使用非静态
文章目录
  1. Effective Java 2th Part I
    1. 创建与销毁对象
    2. 对于所有对象都通用的方法
    3. 类和接口