Effective Java 2 读书笔记 第8章 通用程序设计

第45条:将局部变量的作用域最小化

  1. 要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明
  2. 几乎每个局部变量的声明都应该保护一个初始化表达式
    1. 例外,try-catch,因为初始化会被抛异常,那么在try外声明,在内部初始化
  3. 使方法小而集中,使得一个操作相关的变量不会被另一个操作的代码操作

第46条:for-each循环优先于传统的for循环

  1. 迭代器和索引变量更容易出错

  2. for的for(int i = 0; i < a.lenght; i ++) 每次a.length都执行,性能低,容易忘记
  3. 例外
    1. 过滤:遍历删除部分元素,用remove需要i
    2. 转换:遍历列表或者数组,并取代部分元素值
    3. 平行迭代:同时并行遍历多个集合

第47条:了解和使用类库

类库虽然比较大,但是还是应该熟悉java.lang, java.util, java.io 包括,collections,concurrent等等

因为类库受关注和改进比普通人要更受关注,因此使用会更好

第48条:如果需要精确的答案,请避免使用float和double

  1. float和double类型主要是为了科学计算和工程计算而设计的,它们执行的是二进制浮点运算,并没有提供完全精确的结果,如(1 - 9 * .10) = 0.09999999999999998
  2. 用BigDecimal,int或者long进行精确计算,尤其是货币的时候
  3. BigDecimal,优点,完全控制舍入模式8种,缺点,不方便(类型),慢。
  4. 如果数值范围没有超过9位十进制数字,就可以使用int;如果不超过18位数字,就可以使用long;如果数值可能超过18位数字,就必须使用BigDecimal。

第49条:基本类型优先于装箱基本类型

  1. 选择的时候优先使用基本类型
  2. 这些时候应该使用装箱基本类型
    1. 作为集合中的元素,键和值
    2. 参数化类型<T>中
    3. 进行反射的方法调用
  3. 当一项操作中混合基本类型和装箱基本类型时,装箱基本类型就会自动拆箱,可能会导致NullPointException;另,自动装箱减少了使用装箱基本类型的繁琐,但并没有减少风险。当程序用==比较两个装箱基本类型时候,做了同一性比较,几乎肯定不是你所希望的
  4. 装箱导致高开销和不必要的对象创建

第50条:如果其他类型更合适,则尽量避免使用字符串

  1. 字符串不适合代替其他的值类型,如int,是否的boolean等
  2. 不适合代替枚举
  3. 不适合代替聚集类型,如使用分隔符来存储数据,不是好的方式 ,a#b#c,以#来间隔
  4. 不适合代替能力表,如用string基于键的api

第51条:当心字符串连接的性能

  1. +是把多个字符串合并为一个字符串的遍历途径,但是大规模时候,为连接n个字符串,重复使用连接符操作,需要n的平方级。因为字符串是不可变的,造成了很多需要垃圾回收的中间对象。事实上,每个+会自动引入一个StringBuilder,来构造新的string。
  2. 使用StringBuilder的append方法,分配一次,使用多次,可以预分配大小,也可以让其自动扩展
  3. 原则,不要使用字符串连接符来合并多个字符串,除非性能无关紧要。应该使用StringBuilder或者String数组

第52条:通过接口引用对象

  1. 如果有合适的接口类型存在,那么对于参数,返回值,变量和域来说,就都应该使用接口类型进行声明,通常更改实习的时候,只是更改构造器中类的名称,如
    List<Subscriber> subscribers = new Vector<Subscriber>();
    改为
    List<Subscriber> subscribers = new ArrayList<Subscriber>();
  2. 注意:如果原来的实现提供了特殊的功能,而这种功能并不是接口所有,周围的代码又依赖于次功能,新的实现也要提供同样的功能。
  3. 如果没有合适的接口存在完全可以用类而不是接口来引用对象,如值类型,已经没有关联接口的具体类
  4. 对象属于框架,则用基础类来引用对象 如java.util.TimerTask
  5. 类实现接口,但是有接口没有的方法
  6. 总之,接口引用对象会使程序更加灵活,如果不能,使用类层次结构中提供了毕业功能的最基础的类

第53条:接口优先于反射机制

对反射理解不深

第54条:谨慎地使用本地方法

  1. 指使用本地程序设计语言编写的特殊方法
  2. jvm越来越快,本地方法提供性能不值得
  3. 本地语言不安全,平台相关,不方便移植
  4. 尽可能少使用,必要时候才使用,而且极少数情况会用到,并全面测试

第55条:谨慎第进行优化

不要费力去编写快速的程序,应该努力编写好的程序,速度随之而来

第56条:遵守普遍接受的命名惯例

命名规范

如果长期养成的习惯与此不同,不要盲目遵从这些命名规范,可以运用常识

你可能感兴趣的:(java,设计模式,jvm,框架,读书)