effective 笔记

一、创建和销毁对象

1.用静态工厂方法代替构造方法
2.多个构造参数时,考虑构造器
3.用枚举实现单例
4.用私有的构造方法,强化不可实例化的能力
5.避免创造不必要的对象
6.消除过期对象的引用
7.避免使用终结的方法
不应该依赖终结方法来更新重要 的持久状态

二、所有对象都通用的方法

1.equals :1)自反性 2)对称性 3)传递性 4) 一致性

  1. 使用 == 操作符检查 “参数是否为这个对象的引用”
    2.使用instanceof 操作符检查 “参数是否为正确的类型
    3.把参数转换成正确的类型。
    4.对于该类中,的每个“关键” 域,检查参数中的域是否与该对象中的对应的域匹配
    Float / Double 浮点数的比较 ,用 compare
    Arrays.equals

覆盖equals 方法时,总要覆盖hashCode

始终要覆盖toString

谨慎的覆盖clone

考虑实现Comparable

三、类和接口

1.使类和成员的可访问性最小化 private package(default) protected public
数据是可变的,安全漏洞中,最长常见的根源

2.在公有类中使用访问方法,而非公有域 公有类不应该暴露数据域

3.使可变性最小化
1)不要提供任何可修改对象状态的方法 (mutator)
2)保证类不会被扩展
3)使所有的域都的final的
4)使所有的域方法都是私有的
5)确保对于任何可变组件的互斥访问。

4.在公有类中使用访问方法而非公有域

5.使可变性最小化
使类成为不可变,要遵循下面五条规则:1)不要提供任何会修改对象状态的方法 2)保证类不会被扩展 3)使所有的域都是final的 4)使所有的域都是私有的 5)确保对于任何可变组件的互斥访问。

6.复合优先于继承

7.要么为继承为设计,并提供文档说明,要么就禁止继承
好的API 文档应该描述一个给定的方法做了什么工作,而不是描述它是如何工作的。
1) 类必须通过某种形式提供适当的钩子(hook),以便能够进入它的内部工作流程中,这种形式可以是精心选择的受保护(protected)的方法
2) 构造器决不能调用会被覆盖的方法
3)无论是clone还是readObject方法,都不可以调用可覆盖的方法

8.接口只用于定义类型
静态导入机制
接口应该只被用来定类型,而不应该用来到处常量
9.类层次优于标签类
10.用函数对象表示策略

函数对象:定义这样一种对象,它的方法执行其他对象(这些对象被显示传递给这些方法)上的操作,如果一个类,仅仅导出这样的一个方法,他的实例实际上就等同于一个指向该方法的指针。这样的的实例被称为函数对象。
函数指针的主要用途就是实现策略(Strategy)模式,为了在java中实现这种模式,要声明一个接口来表示该策略,并且为没具体的策略声明一个实现了该接口的的类,当一个具体的策略只能被使用一次时,通常使用使用匿名类来声明和实例化这个具体的策略类,当一个具体策略是设计用来重复使用的时候,他的类通常就要被实现为私有的的静态成员类,并通过公有的的静态final域被导出,其类型为该策略接口。

11.优先考虑静态成员类
嵌套类有4种:1) 静态成员类,非静态成员类,匿名类,和局部类

四、 泛型

1.请不要在新代码中,使用原生类型
2.消除非受检警告
3.列表优先于数组
1) Object[] objectArray = new Long[1]; objectArray[0] = “I don’t fit in”; 运行时报错
List ol = new ArrayList(); ol.add(“I don’t fit in”); 编译时报错
2) 数组是具体化的,泛型是通过擦除来实现的(erasure) 擦除 就是 使泛型可以与没有使用泛型的代码随意互用
3) 数组是协变且可以具体化的,泛型是可变且可以擦除的。
4.优先考虑泛型
5.优先考虑泛型方法
1)泛型方法的一个显著特征:无需明确指定类型参数的值,不像调用泛型构造器的时候是必须指定的,编译器通过检查方法参数的类型来计算类型参数的值,对于上述的程序而言,编译器发现union的两个参数都是Set类型,因此指定类型参数E必须为String,这个过程称作 类推导(type inference)
6.利用有限制通配符来提升API的灵活性
为了获得最大限度的灵活性,要在表示生产者或消费者的输入参数上使用通配符类型。(PECS - producer-extends,consumer-super)

7.优先考虑类型安全的异构容器

当一个类的字面文字被用在方法中,来传达编译时的和运行时的类型信息时,被称作 type token

分享
MongoDB·常用命令记录