Effective Java (1) 思量用静态工场要领取代结构器
一、媒介
从本日开始打算用一个月的时间,通过写念书条记的方法来记录阅读这本Java规模经典中的经典书籍 – Effective Java进程中本身所思所想,以备今后查阅,同时分享出去也但愿可以辅佐到其他人,空话不多说,此刻开始第一篇:建设和销毁工具。
二、思量用静态工场要领取代结构器
①. 一般我们有什么步伐可以建设工具呢?
要领1: 利用类公有结构器。
要领2:利用类的静态要领返回一个实例。
②. 利用静态要领建设工具有什么利益?
利益1: 静态工场要领的名字是由我们本身定名,而结构要领必需与类同名。
PrimeNumber primeNumber1 = new PrimeNumber(int Random); // 返回一个素数 PrimeNumber primeNumber2 = PrimeNumber.newInstance(); // 利用静态工场要领暗示更为清楚
利益2: 结构要领每次挪用的时候都需要建设一个工具,而静态工场要领每次挪用的时候就不会建设一个新的工具,这对付一个要频繁建设工具的措施来说,可以极大的提高机能,单例模式就是这样实现的。
利益3: 静态工场要领可以返回原返回范例的任何子范例的工具,这样使我们在选择返回工具的类时就有了更大的机动性。
class Father { private Father() { } public static Father newInstance(String type) { if (type.equals("ChildA")) { // 按照范例判定返回谁人子类工具 return new ChildA(); } else { return new ChildB(); } } public void getName() { System.out.println("My name is father"); } private static class ChildA extends Father { public void getName() { System.out.println("My name is child A"); } } private static class ChildB extends Father { public void getName() { System.out.println("My name is child B"); } } } public class Test { public static void main(String[] args) { Father c1 = Father.newInstance("ChildA"); c1.getName(); Father c2 = Father.newInstance("ChildB"); c2.getName(); } }
查察本栏目
利益4: 静态工场要领在建设参数化范例实例的时候,可以使代码变得越发简捷。
private Map<String, List<String>> map = new HashMap<String, List<String>>(); public static <K, V> HashMap<K, V> newInstance() { return new HashMap<K, V>(); }
③. 利用静态工场要领建设工具有什么缺点?
缺点1: 假如一个类只能通过静态工场要领来得到实例,那么该类的结构函数就不能是共有的或受掩护的,那么该类就不会有子类,即该类不能被担任。单例模式中首先要私有化结构器。
缺点2:静态工场要领和其他静态要领从名字上看无法区分,所以我们可以约定静态工场要领名字利用valueOf可能getInstance。
④. 什么时候用静态工场要领,什么时候用结构器呢?
静态工场要领和共有结构器各有用处,我们需要领略他们各自的优点,静态工场凡是越发符合,因此切忌第一回响就是提供公有的结构器,而不先思量静态工场。
作者:csdn博客 zdp072