读书笔记:Effective Java-第9章 通用编程

11 篇文章 0 订阅
11 篇文章 0 订阅

目录

Item 57: Minimize the scope of local variables

Item 58: Prefer for-each loops to traditional for loops

Item 59: Know and use the libraries

Item 60: Avoid float and double if exact answers are required

Item 61: Prefer primitive types to boxed primitives

Item 62: Avoid strings where other types are more appropriate

Item 63: Beware the performance of string concatenation

Item 64: Refer to objects by their interfaces

Item 65: Prefer interfaces to reflection

Item 66: Use native methods judiciously

Item 67: Optimize judiciously

 Item 68: Adhere to generally accepted naming conventions


Item 57: Minimize the scope of local variables

将局部变量的作用域最小化

Item 58: Prefer for-each loops to traditional for loops

for-each循环优先于传统的for循环

相比传统for循环,for-each循环在简洁性、灵活性、bug预防性等方面有绝对优势,且没有性能降低问题。

Item 59: Know and use the libraries

了解和使用类库

不要重复造轮子。善于使用现有类库并非是编程能力差的表现。

Item 60: Avoid float and double if exact answers are required

如果需要精确的答案,请避免使用floatanddouble

在精确答案的计算任务中,可用BigDecimal代替。

如果介意性能损耗,且不介意自己处理小数部分、涉及数值不大,可使用int(没超过9位数字)或long(没超过18位),否则必须使用BigDecimal。

Item 61: Prefer primitive types to boxed primitives

基本类型优先于装箱基本类型

基本类型更简单、快速。

当基本类型和装箱基本类型混合计算时,程序会进行拆箱操作,这时可能抛出NullPointerException。

Item 62: Avoid strings where other types are more appropriate

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

string类型更加笨拙、不灵活、速度慢、容易出错。

当数据是非字符串时,优先采用或者设计新的类来替代字符串。

Item 63: Beware the performance of string concatenation

注意字符串连接的性能

字符串连接符(+)适用于较小的、大小固定的字符串拼接。重复连接n个字符串的需要消耗n的平方级的时间。

// 不推荐做法
String result = "";
for (int i=0; i< numItems(); i++)
    result += lineForItem(i);

需要拼接大量且较大的字符串时,应使用StringBuilder代替,时耗线性增加。或者用字符串数组。

Item 64: Refer to objects by their interfaces

通过接口引用对象

如果有合适的接口类型存在,那么对于参数、返回值、变量、域都应该使用接口类型,而不是类。

如果没有合适的接口类型,那么尽可能使用最上层的基(父)类。

好处:更灵活,代码需要替换具体实现时,可以让周围代码无感知。

Item 65: Prefer interfaces to reflection

接口优先于反射机制

反射应用场合:创建和访问运行时可能不存在的类、方法、域。

反射的弊端:不能编译时进行类型检查、代码繁琐且难读、性能损失。

如果程序必须和编译时未知的类一起工作,如果有可能,就应该仅仅使用反射机制来实例化对象,使用接口类型或超类来访问对象。

Item 66: Use native methods judiciously

谨慎地使用本地方法

术语

  • JNI:Java Native Interface
  • native methods: 本地方法,用本地编程语言(如c\c++)编写的方方。本地语言是和平台相关的。

本地方法主要有3种用途(但都很少这么做):

  1. 访问特定于平台(platform-specific)的设施,如注册表。
  2. 访问现有的本地代码库。
  3. 编写应用程序中注重性能的部分。

本地方法弊端:

  • 本地语言是不安全的,本地方法不能免受内存毁坏错误的影响。
  • 本地方法的应用程序难以debug。
  • 使用不当还会降低性能。因为垃圾回收器不是自动的,无法追踪本地内存使用情况,且进入和退出本地代码时需要额外开销。

如果不可避免要使用本地方法,则尽可能少用,且进行全面测试。

Item 67: Optimize judiciously

谨慎地进行优化

考虑API设计决策的性能后果,避免限制性能的设计决策。

精心设计程序,有了清晰、简明、良好的结构,速度自然会提升。如果还不行,再考虑优化。

每次试图优化前后,要对性能进行测量。

有个常识:程序把90%的时间花在10%的代码上。

要借助性能剖析工具(profiling tool)来分析性能问题。

推荐一个非性能剖析工具jmh。

java有以下问题:

  • 没有很强的性能模型:各种基本操作的相对开销没有明确定义。
  • 性能在不同的jvm实现、发行版本、处理器间会有差异。

 Item 68: Adhere to generally accepted naming conventions

遵守普遍接受的命名惯例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值