কনস্ট্রাক্টর চেইনিং (Constructor Chaining) কী?
জাভাতে `this()` কীওয়ার্ড ব্যবহার করে একই ক্লাসের একটি কনস্ট্রাক্টর থেকে অন্য কনস্ট্রাক্টর কল করা যায়। এটিকে কনস্ট্রাক্টর চেইনিং বলা হয়। এটি কোড ডুপ্লিকেশন এড়াতে এবং কনস্ট্রাক্টর লজিক সেন্ট্রালাইজ করতে সাহায্য করে।
নियमাবলী
- `this()` কনস্ট্রাক্টরের **প্রথম স্টেটমেন্ট** হতে হবে
- একই ক্লাসের অন্য কনস্ট্রাক্টর কল করে
- সুপার ক্লাসের কনস্ট্রাক্টর কল করতে হলে `super()` ব্যবহার করুন
- একই সময়ে `this()` এবং `super()` দুটোই ব্যবহার করা যায় না
ইনপুট ও আউটপুট উদাহরণ
ইনপুট:
The numbers are defined as 12 and 30
আউটপুট:
The sum is: 42 The product is: 360
অ্যালগরিদম
- প্রোগ্রাম শুরু করুন
- ইনস্ট্যান্স ভেরিয়েবল ঘোষণা করুন: my_sum বা my_product
- নো-আর্গ কনস্ট্রাক্টরে `this(12, 30)` কল করুন
- প্যারামিটারাইজড কনস্ট্রাক্টর ভ্যালু প্রসেস করুন
- display() মেথড দিয়ে ফলাফল প্রিন্ট করুন
- মেইন মেথডে অবজেক্ট তৈরি করুন এবং display() কল করুন
- প্রোগ্রাম শেষ করুন
উদাহরণ ১: যোগফল (Sum) বের করা
public class Main {
int my_sum;
// নো-আর্গ কনস্ট্রাক্টর - অন্য কনস্ট্রাক্টর কল করে
Main() {
this(12, 30); // প্যারামিটারাইজড কনস্ট্রাক্টর আহ্বান
}
// প্যারামিটারাইজড কনস্ট্রাক্টর
Main(int my_input_1, int my_input_2) {
System.out.println("The numbers are defined as " + my_input_1 + " and " + my_input_2);
this.my_sum = my_input_1 + my_input_2;
}
void display() {
System.out.println("The sum is: " + my_sum);
}
public static void main(String[] args) {
Main my_object = new Main(); // নো-আর্গ কনস্ট্রাক্টর কল হয়
my_object.display();
}
}
উদাহরণ ২: গুণফল (Product) বের করা
public class Main {
int my_product;
Main() {
this(12, 30);
}
Main(int my_input_1, int my_input_2) {
System.out.println("The numbers are defined as " + my_input_1 + " and " + my_input_2);
this.my_product = my_input_1 * my_input_2;
}
void display() {
System.out.println("The product of the two values is: " + my_product);
}
public static void main(String[] args) {
Main my_object = new Main();
my_object.display();
}
}
এক্সিকিউশন ফ্লো
new Main()
│
▼
Main() [নো-আর্গ কনস্ট্রাক্টর]
│
├── this(12, 30) ──► Main(int, int) [প্যারামিটারাইজড কনস্ট্রাক্টর]
│ │
│ ├── System.out.println(...)
│ ├── this.my_sum = 12 + 30 = 42
│ │
│ ◄── রিটার্ন
│
◄── রিটার্ন (অবজেক্ট তৈরি হয়েছে)
│
▼
my_object.display() ──► "The sum is: 42" প্রিন্ট
বহু কনস্ট্রাক্টর চেইনিং
public class Employee {
private String name;
private int age;
private double salary;
private String department;
// ১. ফুল কনস্ট্রাক্টর
public Employee(String name, int age, double salary, String department) {
this.name = name;
this.age = age;
this.salary = salary;
this.department = department;
}
// ২. ডিপার্টমেন্ট ছাড়া
public Employee(String name, int age, double salary) {
this(name, age, salary, "General");
}
// ৩. শুধু নাম ও বয়স
public Employee(String name, int age) {
this(name, age, 0.0);
}
// ৪. শুধু নাম
public Employee(String name) {
this(name, 0);
}
// ৫. ডিফল্ট
public Employee() {
this("Unknown");
}
}
super() vs this()
| কীওয়ার্ড | কল করে | পজিশন |
|---|---|---|
| this() | একই ক্লাসের অন্য কনস্ট্রাক্টর | কনস্ট্রাক্টরের প্রথম লাইন |
| super() | প্যারেন্ট ক্লাসের কনস্ট্রাক্টর | কনস্ট্রাক্টরের প্রথম লাইন |
class Parent {
Parent(String msg) { System.out.println("Parent: " + msg); }
}
class Child extends Parent {
Child() {
super("Hello from Child"); // প্যারেন্ট কনস্ট্রাক্টর কল
// this() এবং super() একসাথে ব্যবহার করা যায় না
}
}
সাধারণ ভুল
- `this()` প্রথম স্টেটমেন্ট নয় → কম্পাইল এরর: "Call to this must be first statement in constructor"
- সাইক্লিক কল: `this()` → `this(1)` → `this()` → StackOverflowError
- প্রাইমিটিভ টাইপে `this` ব্যবহার করা যায় না (শুধু রেফারেন্স টাইপ)
সেরা অনুশীলন
- সবচেয়ে বিস্তৃত কনস্ট্রাক্টরে মূল লজিক রাখুন, বাকিগুলো সেটা কল করুন
- ডিফল্ট ভ্যালু দিয়ে কনস্ট্রাক্টর চেইনিং করুন
- বিল্ডার প্যাটার্ন বিবেচনা করুন যদি প্যারামিটার ৪+ হয়
- ইমিউটেবল অবজেক্টের জন্য কনস্ট্রাক্টর চেইনিং আদর্শ