一个非常简单的限定对象数量的方法

有时在工作,可能会出现一些情况,我们不适合使用单例模式,但是又不允许无限制的new同一个对象;

我的思路是设置一个当前对象数量,每创建一个对象则+1,一个对象被回收则-1;大于最大数量则不允许创建对象;方法很简单;

下面是试例代码:

package test;

import java.lang.reflect.InvocationTargetException;

public class TestStatic {

    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 150; i++) {
            Thread t = new Factory("name" + i);
            t.start();
        }
    }

}

class Factory extends Thread{
    Test test;
    public Factory(String name) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException{
        this.test = Test.getInstance(name);
        //this.test =  (Test) Class.forName("test.Test").getConstructor(new Class[]{String.class}).newInstance(new Object[]{name});
    }
    public void run(){
        test.doSomething();
        test = null;
    }
}


class Test {
    String name;
    public static int count = 0;
    private static int maxNum = 100;

    public Test(String name) {
        count++;
        System.out.println(name + " is new");
        this.name = name;
    }

    public static Test getInstance(String name) {
        while (true) {
            if (Test.maxNum > count) {
                return new Test(name);
            } else {
                count++;
                if (count == 1000) {
                    count = 0;
                    System.out.println("recycle");
                }
                System.gc();
            }
        }
    }

    public void doSomething() {
        try {
            System.out.println(name + "start doSomething");
            Thread.sleep(5000);
            System.out.println(name + "complete doSomething");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println(this.name + "is destroyed");
        count--;

    }
}

Test类是可能会被多次创建的类,于是我们可以使用类似单例模式的一个方法写一个getInstance方法,在Test类里边添加Test可以创建的最大个数以及当前已经创建的数量;每次getInstance的时候都要做一些验证;如果超过最大数量,则可以做一些相关操作比较调用垃圾回收器,或者提示错误等等;另一个比较重要的操作就是要利用finallize方法;每当一个Test对象被回收之后,就立即更改当前Test的对象数量,以便别人可以获取该Test对象;

 

ps:这种方法也会存在一个问题,就是如果使用反射机制来生成对象的时候,可能会遇到一些问题;

posted @ 2013-07-17 17:08  roilat  阅读(436)  评论(0编辑  收藏  举报