共计 1974 个字符,预计需要花费 5 分钟才能阅读完成。
1. 使用静态工厂方法替代构造方法
静态工厂方法的优点:不像构造方法,它是有名字的。它不需要每次调用时都创建一个新对象。它可以返回 其返回类型的任何子类型的对象。返回对象的类可以根据输入参数的不同而不同。在编写包含该方法的类时,返回的对象的类不需要存在。
2. 当构造方法参数过多时请使用 builder 模式
当一个对象中,属性过多时,使用构造方法时,参数过多导致难以维护,并且很难读懂每个参数的含义是什么。
使用 构造方法 来构建必传参数,而用 setter 的方式来传可选参数呢?这看似参数少,创建实例也很容易,并且所生成的代码也易于阅读。但由于 JavaBeans 模式本身有严重的缺陷,由于构造方法在多次调用中被分割,导致 JavaBeans 可能处于不一致的状态,并且还需要额外增加工作以确保线程安全。
最好处理参数过多的方法是使用 builder 模式,它结合了可伸缩构造方法模式的安全性和 JavaBeans 模式的可读性,然后在调用 builder 对象的 setter 相似方法来设置每个可选参数。
3. 使用依赖注入的方式注入资源
依赖注入的实践将极大地增强类的灵活性、可重用性和可测试性。
4. 不要创建不必要的对象
如果对象是不可变的,它总是可以被重用的,比如 String 类是 final 的,不可变的,最好不要用 new String(“test”),因为它每次都会创建一个新的对象。在性能有严格要求的情况下,优先使用基本类型而不是装箱的基本类型,也要注意无意识的自动装箱,因为它们会影响性能。
5. 消除过期的对象引用
这个也就是常说的内存泄露。当一个类自己管理内存时,应该警惕内存泄漏问题。每当一个元素被释放时,元素中包含的任何对象引用都应该被清除。
另一个常见的内存泄漏来源是缓存。一旦将对象引用放入缓存中,很容易忘记它的存在,可以用 WeakHashMap 来表示缓存。
6. 避免使用 Finalizer 和 Cleaner 机制,请使用 try-with-resources 语句
用于 Finalizer 和 Cleaner 机制的不确定性,我们不知道它到底何时会执行。例如,依赖于 Finalizer 和 Cleaner 机制来关闭文件是严重的错误,因为打开的文件描述符是有限的资源。如果由于系统迟迟没有运行 Finalizer 和 Cleaner 机制而导致许多文件被打开,程序可能会失败,因为它不能再打开文件了。可以用 try-with-resources 语句 或 try-finally 语句,当打开多个文件时,try-finally 语句的可读性就不如 try-with-resources 语句,因此推荐使用 try-with-resources 语句。
7. 重写 equals 方法时同时也要重写 hashcode 方法
重写 equals 方法时,需要满足以下特性。自反性:一个对象必须与自身相等。对称性:任何非空引用 x 和 y,如果且仅当 y.equals(x) 返回 true 时 x.equals(y) 必须返回 true。传递性:如果第一个对象等于第二个对象,第二个对象等于第三个对象,那么第一个对象必须等于第三个对象。一致性:如果两个对象是相等的,除非一个(或两个)对象被修改了,那么它们必须始终保持相等。非空性:对于任何非空引用 x,x.equals(null) 必须返回 false。
每次重写 equals 方法时都必须重写 hashCode 方法,否则程序将无法正常运行。hashCode 方法必须遵从 Object 类指定的常规约定,将不同的哈希码分配给不同的实例对象。
8. 始终重写 toString 方法
Object 类提供了 toString 方法的实现是包名 + 类名 +@+ 哈希码的无符号十六进制。toString 的通用约定要求,返回的字符串应该是“一个简洁但内容丰富的表示,对人们来说是很容易阅读的”。就需要 toString 方法,方便可读性。
9. 考虑实现 Comparable 接口
在需要可比较的场景中,最好实现 Comparable 接口,以便在基于比较的集合中轻松对其实例进行排序,搜索和使用。比较 compareTo 方法的实现中的字段值时,请避免使用 ”<“ 和 ”>” 运算符。最好使用包装类中的静态 compare 方法或 Comparator 接口中的构建方法。
10. 使类和成员的可访问性最小化
一个优秀设计的组件隐藏了它的所有实现细节,干净地将它的 API 与它的实现分离开来。然后,组件只通过它们的 API 进行通信,并且对彼此的内部工作一无所知。称为信息隐藏或封装,是软件设计的基本原则。
Java 中的四种访问级别:private——只能自己访问。package-private——默认级别,同包中的任意类访问。protected——子类和自己可以访问。public —— 任何类都可访问。
PS: 清山绿水始于尘,博学多识贵于勤。我有酒,你有故事吗?微信公众号:「清尘闲聊」。欢迎一起谈天说地,聊代码。