Guice Dependency Injection Framework এ Eager Singleton এবং Lazy Singleton দুটি বিভিন্ন ধরনের Singleton Scope রয়েছে। এগুলোর মধ্যে মূল পার্থক্য হলো অবজেক্ট ইনস্ট্যান্সিয়েশন এর টাইমিং এবং ডিপেন্ডেন্সি ইনজেকশন পদ্ধতি।
এখানে, আমি Eager Singleton এবং Lazy Singleton এর মধ্যে পার্থক্য ব্যাখ্যা করব।
1. Eager Singleton (Eager Instantiation)
Eager Singleton হল সেই ধরনের সিঙ্গলটন যেখানে অবজেক্টটি তৈরি হয় অ্যাপ্লিকেশন চালু হওয়ার সময় বা মডিউল ইনজেকশন করার সাথে সাথেই। Guice Eager Singleton এর জন্য @Singleton অ্যানোটেশন ব্যবহার করে এবং এটি নিশ্চিত করে যে একবার ক্লাসটি তৈরি হলে সেটি সবসময় একই ইনস্ট্যান্স প্রদান করবে।
বিশেষত্ব:
- অবজেক্ট তৈরি হয়: অ্যাপ্লিকেশন বা মডিউল লোড হওয়ার সাথে সাথেই।
- ডিপেন্ডেন্সি ইনজেকশন: একবার ইনস্ট্যান্স তৈরি হয়ে গেলে, পরবর্তী সময়ে পুনরায় তৈরি হয় না।
- সুবিধা: দ্রুত অ্যাক্সেস এবং ইনস্ট্যান্স গঠন (কোনো বিলম্ব ছাড়াই)।
- নুকসান: যদি অবজেক্টের ইনস্ট্যান্স প্রয়োজন না থাকে, তবে অযথা রিসোর্স খরচ হতে পারে, কারণ অবজেক্ট আগেই তৈরি হয়ে থাকে।
উদাহরণ:
import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
class Service {
public Service() {
System.out.println("Service created");
}
public void execute() {
System.out.println("Executing Service");
}
}
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).in(Singleton.class); // Eager Singleton
}
}
এখানে, Service ক্লাসটি Eager Singleton হিসেবে বানানো হয়েছে। bind(Service.class).in(Singleton.class); এই কনফিগারেশনটি নিশ্চিত করে যে Service ক্লাসের মাত্র একটিই ইনস্ট্যান্স তৈরি হবে, এবং Guice এটিকে শুরুতেই ইনস্ট্যান্সিয়েট করবে।
2. Lazy Singleton (Lazy Instantiation)
Lazy Singleton হল সেই ধরনের সিঙ্গলটন যেখানে অবজেক্টটি তখনই তৈরি হয় যখন প্রথমবার সেটি প্রয়োজন হয় (মানে লেজি লোডিং)। এখানে, Guice ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে, এবং অবজেক্ট তৈরি করার জন্য Lazy সাপোর্ট থাকে, যেমন Provider<T> ব্যবহার করা হয়।
বিশেষত্ব:
- অবজেক্ট তৈরি হয়: প্রথমবার ব্যবহার করার সময়।
- ডিপেন্ডেন্সি ইনজেকশন: একবার অবজেক্ট তৈরি হওয়ার পরে, সেটি পরবর্তী সময়ে আবার তৈরি হবে না।
- সুবিধা: অবজেক্টের ইন্সট্যান্স কেবল তখনই তৈরি হবে যখন তা সত্যিকার অর্থে প্রয়োজন হয়, যার ফলে অপ্রয়োজনীয় রিসোর্স খরচ কমে।
- নুকসান: প্রথমবার ইনস্ট্যান্স তৈরি হতে সময় লাগে, কারণ এটি লেট-লোডেড।
উদাহরণ:
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
import com.google.inject.Singleton;
class Service {
public Service() {
System.out.println("Service created");
}
public void execute() {
System.out.println("Executing Service");
}
}
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).toProvider(ServiceProvider.class).in(Singleton.class); // Lazy Singleton
}
}
class ServiceProvider implements Provider<Service> {
private Service service;
@Override
public Service get() {
if (service == null) {
service = new Service(); // Lazy Instantiation
}
return service;
}
}
এখানে, Service ক্লাসটি Lazy Singleton হিসেবে তৈরি করা হয়েছে। Provider<T> ব্যবহার করা হয়েছে যাতে সেবা প্রথমবার প্রয়োজন হলে সেটি তৈরি করা হয়। Guice প্রথমবার service.get() কল করলে Service ক্লাসের ইনস্ট্যান্স তৈরি হবে এবং এরপর তা ব্যবহার করা হবে।
Eager Singleton vs Lazy Singleton: পার্থক্য
| বৈশিষ্ট্য | Eager Singleton | Lazy Singleton |
|---|---|---|
| অবজেক্ট ইনস্ট্যান্সিয়েশন | অ্যাপ্লিকেশন বা মডিউল লোড হওয়ার সাথে সাথে। | প্রথমবার প্রয়োজন হওয়ার পর। |
| বিলম্ব | কোনো বিলম্ব নেই, অবজেক্ট তৈরি হয় তৎক্ষণাৎ। | প্রথমবার ব্যবহার করার পর বিলম্ব হয়। |
| রিসোর্স ব্যবস্থাপনা | অবজেক্ট তৈরি হয় আগেই, প্রয়োজনে না থাকলেও রিসোর্স খরচ হতে পারে। | অবজেক্ট তৈরি হয় কেবল তখনই যখন তা প্রয়োজন হয়, রিসোর্স খরচ কম। |
| ব্যবহার | যখন অবজেক্টটি সব সময় ব্যবহৃত হবে। | যখন অবজেক্টটি কেবল তখনই ব্যবহৃত হবে যখন তা প্রয়োজন হয়। |
| সুবিধা | দ্রুত অ্যাক্সেস। | রিসোর্স দক্ষতা, এবং প্রথমবার লেট-লোডিং। |
| নুকসান | অপ্রয়োজনীয় রিসোর্স খরচ। | প্রথমবার লেট লোডিং হতে পারে। |
- Eager Singleton উপযুক্ত যখন আপনি জানেন যে একটি অবজেক্টের ইনস্ট্যান্স অ্যাপ্লিকেশন চলাকালীন সময়ে সবসময় প্রয়োজন হবে এবং আপনি একে শুরুতেই তৈরি করতে চান।
- Lazy Singleton উপযুক্ত যখন আপনি নিশ্চিত না যে একটি অবজেক্টের ইনস্ট্যান্সটি পুরো সময়ব্যাপী প্রয়োজন হবে এবং আপনি কেবল তখনই সেটি তৈরি করতে চান যখন সেগুলি প্রকৃতপক্ষে ব্যবহার হবে।
Guice-এ এই দুটি পদ্ধতির মধ্যে নির্বাচন আপনার অ্যাপ্লিকেশনের প্রাকৃতিক প্রয়োজনে নির্ভর করে, এবং যথাযথ নির্বাচন করলে আপনার অ্যাপ্লিকেশন আরও কার্যকর ও রিসোর্স-দক্ষ হবে।
Read more