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

জাভা প্রোগ্রাম: প্রাইভেট কনস্ট্রাক্টর (Private Constructor) ইমপ্লিমেন্ট করা

প্রাইভেট কনস্ট্রাক্টর (Private Constructor) কী?

প্রাইভেট কনস্ট্রাক্টর হলো এমন একটি কনস্ট্রাক্টর যেটি শুধু ক্লাসের ভিতর থেকেই অ্যাক্সেস করা যায়। এটি বাহির থেকে `new` কীওয়ার্ড দিয়ে অবজেক্ট তৈরি করতে বাধা দেয়। মূলত সিঙ্গলটন প্যাটার্ন (Singleton Pattern), ইউটিলিটি ক্লাস, এবং ফ্যাক্টরি মেথড প্যাটার্নে ব্যবহৃত হয়।

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

ইনপুট:

Run the program

আউটপুট:

Private constructor is being called

অ্যালগরিদম

  1. প্রোগ্রাম শুরু করুন
  2. private কীওয়ার্ড দিয়ে কনস্ট্রাক্টর ডিক্লেয়ার করুন
  3. এটি নিশ্চিত করে যে ক্লাসের বাইরে থেকে অবজেক্ট তৈরি করা যাবে না
  4. স্ট্যাটিক মেথড বা সিঙ্গলটন প্যাটার্ন ব্যবহার করে কন্ট্রোলড ইনস্ট্যান্সিয়েশন করুন
  5. মেইন মেথড থেকে স্ট্যাটিক মেথড কল করে প্রাইভেট কনস্ট্রাক্টর আহ্বান করুন
  6. ফলাফল প্রদর্শন করুন
  7. প্রোগ্রাম শেষ করুন

উদাহরণ ১: বেসিক প্রাইভেট কনস্ট্রাক্টর

class PrivateConstructor {
    private PrivateConstructor() {
        System.out.println("A private constructor is being called.");
    }
    
    public static void instanceMethod() {
        PrivateConstructor my_object = new PrivateConstructor();
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("Invoking a call to private constructor");
        PrivateConstructor.instanceMethod();
    }
}

উদাহরণ ২: সিঙ্গলটন প্যাটার্ন (Singleton Pattern)

import java.io.*;

class PrivateConstructor {
    static PrivateConstructor instance = null;
    public int my_input = 10;
    
    private PrivateConstructor() {
        // প্রাইভেট কনস্ট্রাক্টর - বাহির থেকে new PrivateConstructor() কল করা যাবে না
    }
    
    static public PrivateConstructor getInstance() {
        if (instance == null)
            instance = new PrivateConstructor();
        return instance;
    }
}

public class Main {
    public static void main(String args[]) {
        PrivateConstructor a = PrivateConstructor.getInstance();
        PrivateConstructor b = PrivateConstructor.getInstance();
        
        a.my_input = a.my_input + 10;
        System.out.println("Invoking a call to private constructor");
        System.out.println("Value of first instance = " + a.my_input);
        System.out.println("Value of second instance = " + b.my_input);
    }
}

সিঙ্গলটন প্যাটার্নের উন্নত সংস্করণ (Thread-Safe)

// ১. Eager Initialization (সरल, থ্রেড-সেফ)
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() { return INSTANCE; }
}

// ২. Lazy Initialization with Double-Checked Locking (দ্রুত, থ্রেড-সেফ)
public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

// ৩. Bill Pugh Singleton (হোল্ডার ক্লাস - সবচেয়ে ভালো)
public class Singleton {
    private Singleton() {}
    private static class Holder {
        static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() { return Holder.INSTANCE; }
}

// ৪. Enum Singleton (সর্বোত্তম - সিরিয়ালাইজেশন সেফ, রিফ্লেকশন সেফ)
public enum Singleton {
    INSTANCE;
    public void doSomething() { System.out.println("Singleton method"); }
}

প্রাইভেট কনস্ট্রাক্টরের ব্যবহারের ক্ষেত্রে

ইউটিলিটি ক্লাস উদাহরণ

public final class StringUtils {
    // প্রাইভেট কনস্ট্রাক্টর - ইনস্ট্যান্সিয়েশন বাধা
    private StringUtils() {
        throw new AssertionError("Utility class cannot be instantiated");
    }
    
    public static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }
    
    public static String reverse(String str) {
        return new StringBuilder(str).reverse().toString();
    }
}

রিফ্লেকশন দিয়ে প্রাইভেট কনস্ট্রাক্টর ব্রেক করা (এবং প্রতিরোধ)

// রিফ্লেকশন দিয়ে ব্রেক
Constructor constructor = PrivateConstructor.class.getDeclaredConstructor();
constructor.setAccessible(true);
PrivateConstructor instance = (PrivateConstructor) constructor.newInstance();

// প্রতিরোধ: কনস্ট্রাক্টরে চেক যোগ করুন
private PrivateConstructor() {
    if (instance != null) {
        throw new IllegalStateException("Already instantiated");
    }
}

সেরা অনুশীলন (Best Practices)

  • ইউটিলিটি ক্লাসে `final` ক্লাস + `private` কনস্ট্রাক্টর + `AssertionError` থ্রো
  • সিঙ্গলটনের জন্য Enum ব্যবহার করুন (জগোeiro Bloch রিকমেন্ডেশন)
  • লেজি ইনিশিয়ালাইজেশনের জন্য Bill Pugh প্যাটার্ন ব্যবহার করুন
  • সিরিয়ালাইজেশন সাপোর্ট দরকার হলে `readResolve()` মেথড যোগ করুন
  1. জাভা প্রোগ্রাম: বর্গক্ষেত্রের ক্ষেত্রফল বের করার পদ্ধতি

  2. জাভা প্রোগ্রাম: স্ট্রিং (String) প্রিন্ট করার পদ্ধতি

  3. জাভা প্রোগ্রাম: প্যালিনড্রোম চেক করা

  4. জাভাতে সংখ্যা গণনার প্রোগ্রাম কীভাবে বাস্তবায়ন করবেন?

কপিরাইট © https://bd.wsxdn.com সমস্ত অধিকার সংরক্ষিত
প্যাটার্ন/ব্যবহারব্যাখ্যা
Singletonক্লাসের শুধু একটি ইনস্ট্যান্স নিশ্চিত করা
Utility Classশুধু স্ট্যাটিক মেথড থাকলে (Math, Collections) অবজেক্ট তৈরি বাধা
Factory Methodঅবজেক্ট তৈরি করার লজিক ক্যাপসুলেট করা
Builder Patternকমপ্লেক্স অবজেক্ট ধাপে ধাপে তৈরি করা
Constants Classকনস্ট্যান্ট হোল্ডার ক্লাসে ইনস্ট্যান্সিয়েশন বাধা