effective java是一本关于Java的哲学类书籍,适合有一定基础的Java程序员阅读

在这里插入图片描述

创建和销毁对象

  1. 利用静态工厂方法来代替构造器达到目的。原因:静态方法的第一大优势是有名称,使得方法更加易读,更易扩展。实际例子就是Boolean的valueOf方法,java8已经把Boolean利用构造器转化boolean类型弃用了。第二个优势是静态工厂能够减少类的创建,节省了空间,这是一种代码优化方式。
  2. 传统的JavaBeans模式给对象赋值可以被Builder模式替代,JavaBeans多个setter方法可能会造成线程不安全。而Builder模式利用流式API能够更加优雅的创建对象并且赋值,而且更加安全。这种利用静态内部类创建对象的方法我只能用两个字形容:惊艳。这是一种优化JavaBeans模式的一种方式。从后面的内容来看JavaBeans模式已经被弃用了???这不是很理解。
  3. 强化Singleton属性的方式可以有:构造器私有化、利用枚举。单元素的枚举类型经常成为实现Singleton的最佳方法。这条建议的目的是让特定的类就应该具有特定的作用,整本书对“特定的类只做特定的事情”这样的观点有相当多的重复。
  4. 要想让一个类不能被实例化,就使其构造器私有化。目的是让没有意义的实例化类干脆直接不能被实例化,这样做能让代码更加优雅。
  5. 依赖注入的实现方法其实超级简单。最简单的依赖注入就是用带有参数的构造函数来实现:当创建一个新的实例时,就将该资源传到构造器中。
  6. 避免创造不必要的类。这里提供了三种优化代码的方式:a.利用String时直接对其赋值,不要去new一个新的String。b.使用正则表达式的优化,作者提供了一个对Pattern优化的观点。c.优先使用基本对象而不是装箱类,除非不得不用装箱类。
  7. 警惕内存泄漏。(使用太少,没有理解)
  8. 不要用终结方法finalizer和清除方法cleaner。(使用太少,没有理解)
  9. 利用try-with-resources风格优先于try-finally,这是一个还蛮有意义的优化。使用try-with-resources能够简化close操作,并且抛出的异常更加有用。

对所有对象都通用的方法

  1. 覆盖equals时应该谨慎,一般情况下就不要覆盖了。
  2. 覆盖equals时总是要覆盖hashCode,如果不覆盖的话可能会造成:相等的对象不具有相同的hash code(散列码),这样会使程序无法运行。
  3. 始终覆盖toString,增加代码易读。
  4. 谨慎覆盖clone。更好的方法是提供一个拷贝的构造器或者拷贝工厂。(使用太少,没有理解)
  5. 需要对类进行排序时,使之实现Comparable接口,使其实例可以轻松地被分类、搜索,以及用在基于比较的集合中。(使用太少,没有理解)

类和接口

  1. 让类和成员的可访问性最小化。这个被称为信息隐藏,能够有效地解耦。
  2. 在JavaBeans中private化它的属性,利用getter、setter方法来让属性和外界交流。这是非常经典的体现了面向对象编程思想:如果类可以在它所在的包之外进行访问,就提供访问方法。
  3. 某一些类应该设置为实例不能被修改的类。只利用构造器对其实例赋值,而不设置setter方法,只给getter方法就能够实现不能被修改的类。不可变类本质上线程安全,更加简单,不需要额外考虑许多问题。除非有很好的理由让一个类成为可变类,不然其最好成为不可变类。
  4. 复合优先于继承。具体实现方法是添加一个转发类(forwarding class)来实现复合。(使用太少,没有理解)
  5. 作者对继承有比较大的恶意,因为继承破坏了Java的封装性。应该为继承提供详细的说明文档。(使用太少,没有理解)
  6. 使用接口优于使用抽象类。接口使得能够安全地增强类的功能成为可能。
  7. 为后代实现接口。(使用太少,没有理解)
  8. 特定的类只做特定的事情,这是作者反复强调的一点。接口只用于定义类型,虽然可以利用接口来定义常量,语法没错,但是这太槽糕了。常量接口模式是对接口的不良使用。
  9. 类层次优先于标签类。(使用太少,没有理解)
  10. 静态成员类优先于非静态成员类。嵌套类(内部类)存在的目的应该只是为了他的外部类提供服务的。
  11. 不要在一个源文件里定义多个顶级类,虽然这被允许,但是是非常糟糕的风格。

泛型

  1. 不用使用原生态类型,即List,应该起码用List,原生态类型在java5开始就已经被遗弃了。
  2. 消除非受检警告(可能是IDE显示的黄色警告)。
  3. 列表优于数组。有了ArrayList<>还要用new int[5]干啥呢。
  4. 优先使用泛型。(使用太少,没有理解)
  5. 优先考虑泛型方法。(使用太少,没有理解)
  6. 利用优先通配符类提上API的灵活性。(使用太少,没有理解)
  7. 谨慎并用泛型和可变参数。没有用过可变参数,对这块理解不深。
  8. 优先考虑类型安全的异构容器。(使用太少,没有理解)

枚举和注解

Java支持两种特殊用途的引用类型:一种是特殊类:枚举,一种是特殊接口:注解。

  1. 利用enum代替int常量。不要使用int枚举模式,它不具有类型安全性,并且几乎没有描述性可言。
  2. 用实例域代替序数。不要使用enum自带的顺序,而要自己写上编排顺序。
  3. 用EnumSet代替位域。(使用太少,没有理解)
  4. 用EnumMap代替序数索引。(使用太少,没有理解)
  5. 坚持使用@override。

Lambda和Stream

Java8中,增加了接口函数、Lambda和方法应用,还增加了Stream API。
Lambda和方法引用是完全可以互相转换的,只是看哪种方法更加简洁使用哪种。

方法

  1. 检查参数的有效性。把参数限制写到注解文档中,来显式的检查实施这些限制。
  2. 谨慎使用重载。安全的策略是,永远不要导出两个具有相同参数数量的重载方法,因为编译器有时候编译时会识别不清楚。
  3. 慎用可变参数。极少用到。
  4. 永远不要返回null,你可以选择返回零长度的数组或者集合,但是永远不要返回null。
  5. 编写API注解文档应该规范。

通用编程

  1. 将局部变量的作用域最小化。在使用到局部变量时才定义局部变量,不要老早就定义出来,老早定义出来毫无意义而且增加了代码的阅读难度。
  2. for-each应该优先于for循环,for-each被称为是强化的for循环,更加简洁、灵活,而且能预防出错,几乎全方面碾压。
  3. 能用类库解决的就不要自己写代码去解决。
  4. float和double类型是为了科学计算和工程计算而设计的,尤其不适用与货币计算。
  5. 基本类型优先于装箱基本类型,除非必须使用装箱类型。
  6. 不要一个String打天下,String使用范围非常广,但是不要总是使用String,作者反复强调一个类型只做一件事。
  7. 接口优于反射。反射极大程度上造成了性能损失。
  8. 谨慎使用native方法。说实话,想用native也不知道怎么用。
  9. 谨慎进行优化。应该努力去写好的程序,而不是快的程序。当必须要检查时,优先检查算法。
  10. 遵守普遍的命名规范。

异常

  1. 只针对异常情况才使用异常,不要用异常处理来作为正常的控制流,这是非常糟糕的。还是坐着反复强调的一种功能只做一件事情,不要因为他好用就什么情况都去使用它,这一点都不优美。
  2. 优先使用标准异常。
  3. 不要去忽略异常,不要在catch里面放空语句,什么都不做。如果一定要放空语句,请详细说明。

并发

这块内容不是太熟悉,待完善。

序列化

不太熟悉,待完善。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值