首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用对象池

通用对象池
EN

Stack Overflow用户
提问于 2013-05-30 16:50:54
回答 1查看 396关注 0票数 1

我看到了使用对象池的好处,我也想把它和Vectors结合起来。但是,在阅读有关Vectors的文章时,我发现它们只能在编译时定义,这意味着每个池化类都需要一个单独的pooler类。另一方面,我希望在运行时从池中拉出一个set的随机类实例(都是扩展某个类),这样我就不能确切地知道要调用哪个对象池了。而且,为了不增加池类的代码序列,我希望将所有池合并到一个UniversalPooler类中,然后这个类可以服务于像var foo:SomeClass=UniversalPool.getFromPool(SomeClass);这样的请求。问题是,我如何才能有效地实现这种通用的池子性能,如果可能的话,使用Vectors,并可能使用随机的子类选择?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-30 17:02:59

是的,不幸的是不能使用Vectors,AS3的泛型实现非常糟糕。我使用以下基于类映射DictionaryArrays的池来存储对象:

代码语言:javascript
复制
package util.pool
{
import flash.utils.Dictionary;

public class ObjectPool
{
    private var storage:Dictionary = new Dictionary();

    public function ObjectPool()
    {
    }

    private function createNew(constructor:Class, ...args):Object
    {
        //as3 - (facepalm), why there isn't API to path array of params to constructor
        switch (args.length) {
            case 0:return new constructor();
            case 1:return new constructor(args[0]);
            case 2:return new constructor(args[0], args[1]);
            case 3:return new constructor(args[0], args[1], args[2]);
            case 4:return new constructor(args[0], args[1], args[2], args[3]);
            case 5:return new constructor(args[0], args[1], args[2], args[3], args[4]);
            case 6:return new constructor(args[0], args[1], args[2], args[3], args[4], args[5]);
            case 7:return new constructor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
            case 8:return new constructor(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
            case 9:return new constructor(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
            case 10:return new constructor(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);
            default: throw new Error("too much arguments for constructor, add more switch cases :))");
        }       
    }

    public function create(constructor:Class, ...args):Object
    {
        var pool:Array = getOrCreatePool(constructor);

        var res:*;
        if(pool.length > 0)
        {
            res = pool.pop();
        }else
        {
            args.unshift(constructor);
            res = createNew.apply(null, args);
        }

        return res;
    }

    public function destroy(obj:Object):void
    {
        if(!obj) return;
        if(!(obj is Object)) return;

        var constructor:Class = obj["constructor"];
        var pool:Array = getOrCreatePool(constructor);
        pool[pool.length] = obj;
    }

    public function destroyArr(objs:Object):void
    {
        for each(var obj:Object in objs)
            destroy(obj);
    }

    private function getOrCreatePool(constructor:Class):Array
    {
        var pool:Array = storage[constructor];
        if(!pool)
        {
            pool = [];
            storage[constructor] = pool;
        }

        return pool;
    }
}
}

它可以用作一个全局池。我认为不会有更有效的实现,一般来说,这是一个非常简单的功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16831708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档