কম্পিউটার টিউটোরিয়াল

জাভা প্রোগ্রাম: এক কনস্ট্রাক্টর থেকে অন্য কনস্ট্রাক্টর কল করা (this())

কনস্ট্রাক্টর চেইনিং (Constructor Chaining) কী?

জাভাতে `this()` কীওয়ার্ড ব্যবহার করে একই ক্লাসের একটি কনস্ট্রাক্টর থেকে অন্য কনস্ট্রাক্টর কল করা যায়। এটিকে কনস্ট্রাক্টর চেইনিং বলা হয়। এটি কোড ডুপ্লিকেশন এড়াতে এবং কনস্ট্রাক্টর লজিক সেন্ট্রালাইজ করতে সাহায্য করে।

নियमাবলী

  • `this()` কনস্ট্রাক্টরের **প্রথম স্টেটমেন্ট** হতে হবে
  • একই ক্লাসের অন্য কনস্ট্রাক্টর কল করে
  • সুপার ক্লাসের কনস্ট্রাক্টর কল করতে হলে `super()` ব্যবহার করুন
  • একই সময়ে `this()` এবং `super()` দুটোই ব্যবহার করা যায় না

ইনপুট ও আউটপুট উদাহরণ

ইনপুট:

The numbers are defined as 12 and 30

আউটপুট:

The sum is: 42
The product is: 360

অ্যালগরিদম

  1. প্রোগ্রাম শুরু করুন
  2. ইনস্ট্যান্স ভেরিয়েবল ঘোষণা করুন: my_sum বা my_product
  3. নো-আর্গ কনস্ট্রাক্টরে `this(12, 30)` কল করুন
  4. প্যারামিটারাইজড কনস্ট্রাক্টর ভ্যালু প্রসেস করুন
  5. display() মেথড দিয়ে ফলাফল প্রিন্ট করুন
  6. মেইন মেথডে অবজেক্ট তৈরি করুন এবং display() কল করুন
  7. প্রোগ্রাম শেষ করুন

উদাহরণ ১: যোগফল (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` ব্যবহার করা যায় না (শুধু রেফারেন্স টাইপ)

সেরা অনুশীলন

  • সবচেয়ে বিস্তৃত কনস্ট্রাক্টরে মূল লজিক রাখুন, বাকিগুলো সেটা কল করুন
  • ডিফল্ট ভ্যালু দিয়ে কনস্ট্রাক্টর চেইনিং করুন
  • বিল্ডার প্যাটার্ন বিবেচনা করুন যদি প্যারামিটার ৪+ হয়
  • ইমিউটেবল অবজেক্টের জন্য কনস্ট্রাক্টর চেইনিং আদর্শ
  1. ফাইল থেকে নির্দিষ্ট টেক্সট ডিলিট করার জাভা প্রোগ্রাম

  2. জাভা প্রোগ্রাম: List-এ থেকে ডুপ্লিকেট এলিমেন্ট রিমূভ করা

  3. জাভা প্রোগ্রাম মেইন মেথড ছাড়া এক্সিকিউট করা যায় কি?

  4. জাভা প্যাকেজ অন্য প্যাকেজ থেকে অ্যাক্সেস করা