для неизвестного типа есть обобщенный тип *, без кастов передача ссылки, это будет лучше чем Object в данном случае
Код AS3:
public final class ObjectPool
{
private var pool:Vector.<*>;
private var counter:uint;
private var className:Class;
public function ObjectPool (className:Class, length:uint = 1)
{
this.className = className;
pool = new Vector.<*>(length);
var i:uint = counter = length;
//создадим начальный набор объектов
while (--i > -1)
{
pool[i] = new className();
}
}
public function getObject ():*
{
if (counter > 0)
{
return pool[--counter];
}
// если объекты закончились
// создаю объект и увеличивая длину массива
pool.unshift(new className());
return pool[0];
}
public function releaseObject (value:*):void
{
pool[counter++] = value;
}
// необязательный метод для тестирования
public function toString ():String
{
return "Pool of " + className + " count = " + counter + "/" + pool.length;
}
}
Код AS3:
var pool:ObjectPool = new ObjectPool(Point, 20);
trace(pool);
trace("---------");
for (var i:int = 0, p:Point; i < 40; i++)
{
p = pool.getObject();
p.x = Math.random() * 400;
if (p.x > 300)
pool.releaseObject(p);
trace(pool.toString());
}
странная реализация ObjectPool
1. зачем добавлять в начало когда можно добавлять в конец
2. проверки на in_use нету
3. зачем держать в списке используемые объекты, это имело бы смысл на языках с ручным управлением памяти
4. в списке могут оказаться две ссылки на один и тот же объект если делать releaseObject не в том порядке котором делался getObject
рекомендую использовать упрощенную прозрачную реализацию без всей этой шелухи
Код AS3:
var pool:Vector.<Point> = new Vector.<Point>();
var point:Point = pool.length > 0 ? pool.pop() : new Point(); //getObject
pool.push(point); //releaseObject
Код AS3:
var pool:Vector.<Point> = new Vector.<Point>(20);
for (var i:int = 0; i < pool.length; i++)
pool[i] = new Point();
trace("---------");
for (var i:int = 0, p:Point; i < 40; i++)
{
p = pool.length > 0 ? pool.pop() : new Point();
p.x = Math.random() * 400;
if (p.x > 300)
pool.push(p);
trace("Pool " + pool.length);
}
Добавлено через 31 минуту
Цитата:
Сообщение от caseyryan
"примитивные" типы (которых в as3 на самом деле нет) вроде Number или Boolean
|
Примитивные типы есть (как и в js, es) отличаются иммутабельным поведением и хранением на стеке без дополнительной аллокации памяти