首页 > 代码库 > 【代码优化】私有构造器使用及对象创建优化

【代码优化】私有构造器使用及对象创建优化

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;
    }


我们应该在那些情况下需要注意,对象的主动回收呢??

第一,只要类是自己管理内存,程序员就该警惕内存泄露问题。
第二, 内存泄露的另一常见来源是缓存。
第三,监听器和其他回调。如果使用注册回调,记得用完取消注册。