1、使用私有构造器或者枚举类型强化singleton
1》单例模式---私有构造器,提供一个公有的成员是一个静态工厂方法:
public class SingleTon{
private static final SingleTon single=new SingleTon();
private SingleTon(){ }
public static SingleTon getInstance() {
return single;
}
}
工厂方法的优势一在于它提供了灵活性:在不改变其他api的前提下,我们可以改变改类是否应该为singlton的想法。
但是缺点,在于它很容易被修改,比如改成每个调用改方法的线程返回一个唯一实例。优势二与泛型有关。
2》使用枚举类型:
//enum singleton
public enum SingleTon{
SINGLE;
public void leaveTheBuilding(){。。。}
}
功能上与公有域方法相近,更加简洁,无偿提供序列化机制(上面方法没有提供,需要添加一些序列化操作)
绝对防止了多次实例化。
2、通过私有构造器强化不可实例化能力
显示的构造器私有化,不让外部调用,也不能让它实现子类化,(抽象类可以实现本类不可实例化,但是可以通过子
类化,间接的实例化类)。
3、避免不必要的对象创建
最好能重用对象而不是每次都创建一个相同功能的对象。如果对象是不可变的,它始终可以被重用。
一个极端的例子:
String s=new String(“adffdase”);
每次调用都会创建一个新对象,要是在循环里面,创建的对象可想而知,会创建成千上万的不必要的对象实例。
改进:Sting s=“adffdase”;
也可以使用静态工厂方法,我就不多说了。
4、当你从手工管理内存语言转到java开发,程序在用玩对象之后,会被自动回收,这是多么美好的事情,但是,你
不要认为不再考虑内存管理了
看看下面的代码:
public class Stack{
private Object[] obj;
private int size =0;
public Stack(){
obj = new Object[ 16 ];
}
public void push (Object o){
ensureCapacity();
obj [size++]=o;
}
public Object pop(){
if(size ==0){
throw new EmptyStackException();
}
return obj[--size];
}
private void ensureCapacity(){....}
}
这段代码,看起来没问题,测试也不会有问题,功能都正常,但是隐藏着一个问题,有可能引起内存泄露,
随着垃圾回收器活动的增加,内存占用会不断增加,程序的性能也会降低。
内存泄露发生在哪里呢??
如果一个栈先增长,然后收缩,那么从栈中弹出的对象将不会被回收,即使不在使用这些被弹出的
对象,它们也不会被回收。这是因为,栈内部维护者对这些对象的过期引用(永远不会被解除的引用)。
所以,即便是在java中也要主动回收这些垃圾对象。
改进:
public Object pop(){
if(size ==0){
throw new EmptyStackException();
}
Objcet result =obj[--size];
obj[size]=null;//释放掉弹出栈的对象的引用
return result;
}
我们应该在那些情况下需要注意,对象的主动回收呢??
第一,只要类是自己管理内存,程序员就该警惕内存泄露问题。
第二, 内存泄露的另一常见来源是缓存。
第三,监听器和其他回调。如果使用注册回调,记得用完取消注册。
【代码优化】私有构造器使用及对象创建优化,布布扣,bubuko.com