第8章 通用程序设计

Item 45 局部变量作用域最小化

局部变量的定义,应该在第一次使用它的地方声明,而不总是在代码的开头 

Item 46 for-each循环优先使用

JDK1.5后引入for-each循环,完全隐藏了迭代器/索引变量,避免了混乱和出错的可能

for-each优势:

  1. 简洁
  2. 预防bug
  3. 性能也不差

以下情况无法使用:

  • 遍历集合对某个元素操作时(主要是想利用迭代器的方法)
  • 并行遍历:同时推进遍历多个集合时

Item 47 了解/使用 类库

使用标准类库好处:

  1. 正确
  2. 不用浪费时间在底层细节上
  3. 性能会自主逐渐提高
  4. 让自己的代码更主流

Item 48 避免使用float/double

 Floatdouble类型特别不适合于货币计算,因为不可能用floatdouble精确的表示0.1(及任何10的负幂次方的数)。

Item 49 基本类型 优于 装箱基本类型

Java类型系统:基本类型+引用类型

每个基本类型对应的引用类型 => 装箱基本类型

基本类型VS装箱基本类型区别:

  1. 基本类型只有值
  2. 基本类型只有功能完备的值,而装箱基本类型还有哥非功能值:null
  3. 基本类型更节省时间和空间

使用情况:

  • 作为集合的元素、键、值
  • 参数化类型
  • 反射的方法调用 

Item 50 尽量避免使用字符串

  1. 字符串不适合代替数值等其它类型
  2. 字符串不适合代替枚举类型
  3. 字符串不适合代替聚集类型

Item 51 当心 字符串连接 的性能

连接n个字符串而重复使用连接操作时,需要n的平方级时间

连接时的拷贝操作也是消耗性能的

建议使用StringBuilder.append方法

Item 52 通过接口引用对象

通过接口来引用对象

Object obj = new A();

没有合适接口情况:

  1. 完全可以用类而不是接口来引用对象时,比如值类型
  2. 对象属于一个框架,而框架基本类型是类,不是接口
  3. 类实现了接口,但它提供了接口中不存在的额外方法

Item 53 接口优先于反射

反射代价:

  1. 丧失了编译时类型检查的好处
  2. 执行反射访问所需要的代码非常笨拙和冗长
  3. 性能损失

有些程序,必须用到编译时无法获取的类,通过适当的接口或者超类引用这个类,示例:

Class<?> c1 = null ;
         try {
             c1 = Class.forName(args[ 0 ]);
         } catch (ClassNotFoundException e) {
             System.exit( 1 );
         }
         Set<String> s = null ;
         try {
             s = (Set<String>) c1.newInstance();
         } catch (IllegalAccessException e) {
             System.exit( 1 );
         } catch (InstantiationException e) {
             System.exit( 1 );
         }
         s.addAll(Arrays.asList(args).subList( 1 , args.length));
         System.out.println(s);

Item 54 谨慎使用本地方法

JNI,有三种用途:

  1. 提供了平台相关的访问能力
  2. 提供了访问遗留代码库的能力,从而访问遗留数据
  3. 通过本地语言,编写应用程序中注重性能部分(不过随着VM性能提高,现在越来越没有必要性)

JNI缺点:

  1. 不安全
  2. 平台相关后,影响移植性
  3. 更难调试
  4. 进入/退出本地代码需要固定开销
  5. “胶合代码”的本地方法编写起来单调乏味,难以阅读

Item 55 谨慎本地化

不要因性能而牺牲合理的结构,要编写好的程序而不是快的程序

关键是,要找出程序把时间花在哪些地方并不容易 => 性能剖析

Item 56 命名要普通可接受

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值