قرار است برنامهای بنویسید که ساخت نمونهها را به عهده بگیرد.
فایلهای برنامه را از [source](http://s8.picofile.com/file/8350250950/TestProject.zip.html) دانلود نمایید.
با توجه به توضیحات زیر، متد **init** از کلاس **Initializer** را پیادهسازی کنید.
این متد لیستی از **نام** کلاسهایی که قرار است بر روی آنها عملیات انجام دهد دریافت میکند. سپس از تمام کلاسهای که دارای *Annotation* از نوع **Instantiate** میباشند، یک شی (نمونه) میسازد. دقت کنید که باید از هر **نوع کلاس** تنها یک بار نمونه ساخته شود. اگر در هنگام گرفتن شی *Class* یا ساختن نمونه از کلاسی که دارای *Annotation* مربوطه است خطایی رخ داد، خطایی از نوع **InitializeException** پرتاب کنید. پس خطاهای دیگر مثل *ClassNotFoundException* را دریافت نموده و به جای آن خطای گفته شده را پرتاب کنید.
پس از ساختهشدن نمونهها، باید ارتباط بین نمونهها فراهم شود.
فیلدهای مختلفی در کلاسها وجود دارد. برای **هر کلاسی که از آن نمونه ساختهایم**، اگر فیلدی دارای *Annotation* از نوع **Connect** است، باید مقدار آن برابر یک شی از کلاسی شود که نشاندهندهی تایپ آن فیلد است و از آن نمونه ساختهایم. اگر کلاس موردنظر یا نمونهای از آن وجود نداشت، خطایی از نوع **InitializeException** پرتاب کنید. پس خطاهای دیگر مثل *ClassNotFoundException* را دریافت نموده و به جای آن خطای گفته شده را پرتاب کنید.
برای حل سوال به نکات زیر توجه کنید:
+ برخی از فیلدهای کلاس ممکن است **private** باشند.
+ در حل سوال میتوانید از متد **getAnnotationType** استفاده کنید.
+ **کالکشنی** که توسط متد **init** برگردانده میشود شامل کلاسهایی است که از آنها نمونه ساخته شده است. فقط مجموعهی کلاسها اهمیت دارد و نوع کالکشن خروجی مهم نیست.
+ میتوانید از تست زیر برای بررسی درستی کد خود استفاده کنید.
## تست
```java
@Test
public void TestInitializer() {
Collection<Object> objects = Initializer.init(
Arrays.asList("user.Manager", "user.Service", "user.Developer"));
assertEquals(3, objects.size());
for (Object obj : objects) {
if (obj instanceof Manager) {
// there is a "Connect" annotation for Manager.developer
assertNotNull(((Manager) obj).getDeveloper());
} else if (obj instanceof Service) {
// there is a "Connect" annotation for Service.manager
assertNotNull(((Service) obj).getManager());
// there is no "Connect" annotation for Service.employee
assertNull(((Service) obj).getEmployee());
} else if (obj instanceof Developer) {
// an instance of Developer is created!
} else {
// anything else should fail
fail();
}
}
try {
Initializer.init(Arrays.asList("user.Service", "user.Developer"));
fail();
} catch (Exception e) {
// There is no instance of user.Manager
// can't set manager for user.Service
assertTrue(e instanceof InitializeException);
}
try {
Initializer.init(Arrays.asList("user.notAvailable"));
fail();
} catch (Exception e) {
// couldn't find class
assertTrue(e instanceof InitializeException);
}
objects = Initializer.init(Arrays.asList("user.Developer", "user.Employee"));
// user.Employee doesn't have Instantiate annotation
assertEquals(1, objects.size());
// objects contain only user.Developer
assertEquals("user.Developer", objects.iterator().next().getClass().getName());
}
```
## آن چه که باید آپلود کنید
یک فایل zip است که وقتی آن را باز میکنیم **فقط** فایل Initializer.java را ببینیم.