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