不要过度设计. 面向对象编程,从一开始被洗脑难免在上手写代码时都会首先思考有没有公共方法啊,能不能把两个类抽象成一个父类再继承啊等,慎重使用继承,当要使用继承时一定要在文档注释中写明重写这个方法会给其他方法带来什么影响.书中给出建议如果类并不是为了继承而生,那么这个类应该用final修饰禁止子类化.…
<Effective Java>这本书的结构是90来条tips,有长有短,每条tip都值的学习.这里根据对书中每条tip的理解做简短的总结,方便日后回顾.持续更新~ 1. 考虑用静态方法代替构造方法 要考虑使用静态方法返回对象的理由如下: (1)构造方法名字没有特殊含义,只能是类名.而静态方法可以自己取名,让人一看就知道这个方法的作用.如:Executors.newFixedThreadPool(); (2)构造方法没有静态方法灵活,构造方法一旦调用就必然生成了对象,而静态方法里则可以自己写代…
15. 使类和成员的可访问性最小化 一个好用的类的属性必须要隐藏起来,干净的将它与类的api分离开来,类之间只通过api相互使用,降低他们之间的耦合性.为了做到这一点,建议根据情况选择尽可能低的访问级别修饰符. public 修饰不可变属性时(final修饰的属性)只是暴露的读权限,危害不是很大.但要注意的是,对于成员属性是对象的情况,不能在用final修饰后就认为危害很小了而用public修饰它,final修饰表示引用指向的对象不可变了,但根据引用取修改对象的内容是可以的. 16. 在公共类中…
34.  使用枚举类型替代整型常量 常量的语义表达不清晰,只能靠前面的名称来区分.枚举具有可读性.更安全.更强大等优势.而且枚举类型对象之间的值比较可以使用==来比较值是否相等的,不是必须使用equals方法. 要将数据与枚举常量相关联,首先需要声明实例属性并编写一个构造方法,构造方法带有数据并将数据保存在属性中.枚举本质上是不变的,所有的属性都应设为final. 如下: 一个原始的常量类保存int值: public class Constants { public static final i…
12.  始终重写toString()方法 如果不重写toString()方法,打印的时候是 类名+@+哈希码的无符号十六进制.我们查看 Object的toString()方法如下: public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } 阿里规约也有一条: POJO类必须重写toString方法.如果继承了另一个类,在前面加super.toStr…
67.  明智审慎地进行优化 有三条优化的格言是每个人都应该知道的: (1)比起其他任何单一的原因(包括盲目的愚钝),很多计算上的过失都被归咎于效率(不一定能实现) (2)不要去计算效率上的一些小小的得失,在97%的情况下,不成熟的优化才是一切问题的根源. (3)在优化方面,我们要遵守两条规则: 规则一:不要进行优化 规则二(仅针对专家):还是不要进行优化,也就是说,在你还没有绝对清晰的优化方案之前,请不要进行优化. 努力编写好的程序,而不是快的程序:速度自然会提高.但是在设计系统时一定要考虑性…
56.  为所有已公开的API元素编写文档注释 要正确地记录API,必须在每个导出的类.接口.构造方法.方法和属性声明之前加上文档注释.如果一个类是可序列化的,还需要记录它的序列化形式. 文档注释在源代码和生成的代码中都应该是可读的通用原则. 类或接口中的两个成员方法或构造方法不应具有相同的概要描述. 总结起来就是一句话,文档注释要规范. 阿里规约如下: [强制]类.类属性.类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用 // xxx 方式.[强制]所有的抽象方法(…
45.  明智谨慎地使用Stream 46.  优先考虑流中无副作用的函数 47.  优先使用Collection而不是Stream作为方法的返回类型 48.  谨慎使用流并行 49.  检查参数有效性 大多数方法和构造方法对可以将哪些值传到其对应参数有一些限制.例如:索引必须是非负数.对象引用必须是非null.你应该清楚地在文档中记载所有这些限制,并在方法主体的开头用检查来强制执行. 每次编写方法或构造方法时,都应该考虑对其参数存在哪些限制.应该记住这些限制,并在方法体的开头使用显示检查来强制…
23.  类结构层次优于标签类 有时你会碰到一个类,它的实例有一个或多个风格,并且包含一个tag属性表示实例的风格.例如,如下面的类表示一个圆或者矩形: public class Figure { /** * 标签: circle表示圆 rectangle表示矩形 */ private String tag; private double length; private double width; private double radis; public Figure(double radis)…
1. 考虑使用静态工厂方法替代构造方法 一个类可以提供一个公共静态工厂方法,它只是返回类实例的静态方法.例如JDK的Boolean的valueOf方法: public final class Boolean implements java.io.Serializable, Comparable<Boolean> { public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE =…