1,考虑用静态工厂方法代替构造器
切忌第一反应就是提供共有构造器,而不先考虑静态工厂。
类可以通过静态工厂方法返回客户端而不是构造器。
静态方法获取创建对象。
注意静态工厂方法与设计模式中的工厂方法不同,并不直接对应。
优势:
- 它们有名称。
可以通过方法名称描述返回的对象,使代码更易于阅读。对于通过参数创建不同对象时,静态工厂方法可以根据名称突出它们的区别。
- 不必每次在调用它们时都创建一个新的对象。
单例模式。
- 它们可以返回原返回类型的任何子类型的对象。(接口)
隐式地实现对象的创建。例如Collections,通过接口指定返回对象,用户不需知道怎么创建对象,通过静态工厂方法在Collections中导出。
还可以每次调用时改变返回对象,这取决于静态工厂方法的参数值。例如EnumSet,它返回的实现类。
静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在。这种灵活的静态工厂方法构成了服务提供者框架的基础。服务提供者框架有三个重要的组件:服务接口,提供者注册API,服务房屋API。感觉和android的WMS服务一样。
- 在创建参数化类型实例的时候,他们使代码变得更加简洁。
想map创建时,Map<String, String> s = new HashMap<String, String>(),这样需要2次参数泛型。可以用于静态工厂方法将后面的创建简化。
缺点
- 类如果不含共有的或受保护的构造器,就不能被子类化。
- 他们与其他的静态方法实际上没有区别。用户想要知道如何实例化这个类有些困难,所以要规范命名。如:ValueOf,getInstance,newInstance,getType,newType等。
2,遇到多个构造器参数时要考虑用构造器builder
如果具有多个参数时,Builder就是种不错的选择,特别当大多数参数都是可选的时候。它更易于编写和阅读。
缺点
- 为了创建它的对象,必须先创建构造器,在某些十分注重性能的情况下,可能造成某些问题。Builder模式比重叠构造器模式更加冗长。
3,用私有构造器或者枚举类型强化Singlton属性
使用私有构造器和枚举实现单例模式
4,通过私有构造器强化不可实例化的能力
它保证类在任何情况下都不会被实例化,显示的构造器被私有化了。
场景:
有时候,你可能需要编写只包含静态方法和静态域的类。
5,避免创建不必要的对象
- 如果是不可变对象,它就始终可以被重用。
- 可以重用那些已知不会被修改的可变对象。
- 有些情况则不怎么明显,如Map接口的keyset方法返回该Map对象的set视图,其中包含该Map中所有的键,每次调用返回的是同样的实例。
- 自动装箱会创建多余的新对象。如Long和long。要优先使用基本类型而不是装箱基本类型,要担心无意识的装箱。
- 并不是创建对象的代价非常昂贵,从而要尽量避免创建对象。相反,由于小对象的构造器只做很少的显示工作,所以小对象的创建和回收十分的廉价。通过维护自己的对象池来避免创建对象并不是一种好的做法,除非池中的对象非常重量级,想数据库连接池。
6,消除过期对象的使用
- 一般而言,只要类时自己管理内存,程序员就应该警惕内存泄露的问题。一旦元素被释放掉,则该元素中包含的任何对象引用都该被清空。 = null;
- 内存泄露的另一个常见来源是缓存。可以使用线程进行清理,也可以在每次添加时顺便进行清理。
- 监听器和其他回调。
注册了回调,却没显式地取消注销。
7,避免使用终结方法
- 不应该依赖终结方法来更新重要的持久状态。例如:依赖终结方法来释放共享资源(比如数据库)上的永久锁,很容易让整个分布式系统垮掉。
- 使用终结方法有一个非常严重的性能损失。
提供一个显式的终止方法,要求改类的客户端在每个实例不再有用时调用这个方法。显式的终止一般与try-finally结构结合使用,以确保及时终止。