Effective In Java 札记之创建和销毁对象
Effective In Java 笔记之创建和销毁对象
创建对象时, 应该优先选用静态工厂方法,其具有以下几个优势:
1. 静态工厂方法与构造器不同之一在于静态工厂方法有名字。
2. 静态工厂方法与工早起不同之二在于静态工厂方法不必在每次调用他的时候都创建一个新的对象。
3. 静态工厂方法与工早起不同之三在于静态工厂方法可以返回该类的任何子类对象。
4. 静态工厂方法与工早起不同之四在于创建参数化类型实例的时候, 他们使代码变得更加简洁。
静态工厂方法缺点1.类如果不含共有的或者受保护的构造器,就不能被子类化。
2. 它们与其他的静态方法实际上没有任何区别。
总结: 因为我的编码经验不是很多, 个人认为静态构造方法应该用在比较常用的工具类里面,过多的使用静态工厂方法会造成内存泄露问题,详见JDBC驱动注册的源码。请指正。
创建对象时, 应该优先选用静态工厂方法,其具有以下几个优势:
1. 静态工厂方法与构造器不同之一在于静态工厂方法有名字。
2. 静态工厂方法与工早起不同之二在于静态工厂方法不必在每次调用他的时候都创建一个新的对象。
3. 静态工厂方法与工早起不同之三在于静态工厂方法可以返回该类的任何子类对象。
interface Service { // specify methods go here } interface Provider { Service newService(); } public class Services { private Services() { } private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); public static final String DEFAULT_PROVIDER_NAME = "<def>"; public static void registerDefaultProvider(Provider p) { registerProvider(DEFAULT_PROVIDER_NAME, p); } public static void registerProvider(String name, Provider p) { providers.put(name, p); } public static Service newInstance() { return newInstance(DEFAULT_PROVIDER_NAME); } public static Service newInstance(String name) { Provider p = providers.get(name); if (p == null) { throw new IllegalArgumentException( "No provider registered with name: " + name); } return p.newService(); } }
4. 静态工厂方法与工早起不同之四在于创建参数化类型实例的时候, 他们使代码变得更加简洁。
class MyHashMap<K,V>{ public static <K,V> HashMap<K,V> newInstance(){ return new HashMap<K,V>(); } public static void main(String[] args){ Map<String, List<String>> m = MyHashMap.newInstance(); } }
静态工厂方法缺点1.类如果不含共有的或者受保护的构造器,就不能被子类化。
2. 它们与其他的静态方法实际上没有任何区别。
总结: 因为我的编码经验不是很多, 个人认为静态构造方法应该用在比较常用的工具类里面,过多的使用静态工厂方法会造成内存泄露问题,详见JDBC驱动注册的源码。请指正。