PDA

View Full Version : سوال در زمینه لیست ها



se8820726
دوشنبه 12 اسفند 1392, 23:02 عصر
سلام من این نمونه کد رو دیدم و اصلا معنیشو نفهمیدم.
لطفا اگه ممکنه یکی اینو توضیح بده:


importjava.util.ArrayList;
importjava.util.List;

publicclass Pool<T>{
publicinterface PoolObjectFactory<T>{
public T createObject();
}

privatefinal List<T> freeObjects;
privatefinal PoolObjectFactory<T> factory;
privatefinalint maxSize;

public Pool(PoolObjectFactory<T> factory, int maxSize){
this.factory= factory;
this.maxSize= maxSize;
this.freeObjects=new ArrayList<T>(maxSize);
}

public T newObject(){
T object =null;

if(freeObjects.size()==0)
object = factory.createObject();
else
object = freeObjects.remove(freeObjects.size()-1);

return object;
}

publicvoid free(T object){
if(freeObjects.size()< maxSize)
freeObjects.add(object);
}
}


مثلا این

Pool<T>

یعنی چی ؟؟

T اینجا کارش چیه ؟؟

چرا اومده تو کلاس Pool<T> یه interface بنام PoolObjectFactory<T> تعرف کرده ؟؟

مگه برای استفاده از interface نباید که اول یه کلاس تعریف کرد و اونو توش implement کرد ؟؟
پس چطور اینکارو نکرده اومده factory.createObject(); رو اجرا میکنه ؟؟

تو اینترنت هیچ توضیح فارسی در مورد اینا پیدا نمیکنم از سایتای خارجی هم اصلا چیزی نمیفهمم.

cups_of_java
سه شنبه 13 اسفند 1392, 10:26 صبح
T اینجا کارش چیه ؟؟
ای نماد بر میگرده به Generics و به معنی این هست که کلاس یا متد شما بر اساس انواع مختلفی کار کنه. بعنی نمی خوای از نوع از قبل مشخصی استفاده کنی مثل String, Object, ... و بر اساس هر نوعی که کاربر خواست تعیین کنه کلاس شما و متد شما چک های نوع رو انجام میده. امیدوارم رسونده باشم خیلی کوتاه. مثلن شما می تونی استخری از کانکشن های دیتابیس داشته باشی. استخری از اشیای دانشجو داشته باشی و ... اما کلاس استخر جدا از اینکه رو چه کلاسی کار کنه یه کلاس واحد و مشخص و یکتا هستش. و نمی شه گفت اون شی توی استخر رو باید از چه نوعی گرفت. پس از جنریکز استفاده میکنیم.



چرا اومده تو کلاس
Pool
<
T
> یه interface بنام
PoolObjectFactory
<
T
> تعرف کرده ؟؟
می تونسته بیرونش هم تعریف کنه. اما از اونجایی که جای دیگه با این اینترفیس کاری نداشته و فقط میخواسته راهی برای استفاده کننده از استخر درست کنه که بتونه شی های توی استتخر رو به شکل معینی ایجاد کنه. واسه همین توی همون کلاس تعریفش کرده.




مگه برای استفاده از interface نباید که اول یه کلاس تعریف کرد و اونو توش implement کرد ؟؟
پس چطور اینکارو نکرده اومده
factory.
createObject
(
)
; رو اجرا میکنه ؟؟

چرا!‌ اون اومده یه شی فکتوری که بهش رسیده رو روش تابع createObject رو فراخوانی کرده. این مشتری کلاس استخر هست که باید اون تابع رو و اینترفیسش رو پیاده سازی کرده باشه تا بعدن این فراخوانی دچار مشکل نشه دیگه.
به این روش کاربرد میگن پلیمرفیزم!!!

se8820726
سه شنبه 13 اسفند 1392, 11:12 صبح
سلام داداش دمت گرم.
میشه در مورد نحوه استفاده از این Pool<T> هم یه مثال عملی بزنی ؟؟

cups_of_java
سه شنبه 13 اسفند 1392, 12:19 عصر
فرض کن یه کلاس به اسم توپ داری بعد یه سری توپ رو میخوای تو این استخر بریزی و از اشیاش استفاده کنی. برای اینکار باید اون اینترفیس فکتوری رو واسه توپت پیاده سازی کنی که توش شی توپ رو ایجاد می کنی.
بعد به استخر میگی newObject و یه توپ بهت میده... تمرینت رو باهاش می کنی وقتی کارت تموم شد میگی free و توپ رو میزاری توی سبد برای استفاده های بعدی...
یه چیزی تو این مایه ها...


public class PoolBallFactory<Ball> extends PoolObjectFactory<Ball> {

public Ball createObject() {
return new Ball();
}

}


Pool p = new Pool( new PoolBallFactory(), 100 );
Ball b = p.newObject();
// play with b
p.free( b );