Immutable Object কি এবং কেন String Immutable?

Java এর String Handling - জাভা ইন্টারভিউ প্রশ্ন (Java Interview Questions) - Java Technologies

365

১. Immutable Object কি?

উত্তর: একটি Immutable Object এমন একটি অবজেক্ট যা একবার তৈরি হওয়ার পর তার অবস্থান (state) পরিবর্তন করা সম্ভব নয়। অর্থাৎ, এর ডেটা বা ভ্যালু কোনোভাবেই পরিবর্তন করা যায় না। যদি কোনো পরিবর্তন প্রয়োজন হয়, তবে নতুন একটি অবজেক্ট তৈরি করতে হয়।

যখন একটি অবজেক্ট Immutable হয়, তখন তার সমস্ত ফিল্ড (ভ্যালু) শেষ হয়ে যায় (final) এবং কোন setter মেথডের মাধ্যমে তাদের মান পরিবর্তন করা যায় না। Immutable অবজেক্ট ব্যবহার করার প্রধান সুবিধা হলো এটি থ্রেড-সেফ, অর্থাৎ একাধিক থ্রেড একই অবজেক্টের সাথে কাজ করলেও কোনো ডেটার অস্বাভাবিক পরিবর্তন হয় না।

Immutable অবজেক্ট তৈরির নিয়ম:

  • ক্লাসটি final হতে হবে যাতে এটি কখনও ইনহেরিট না করা যায়।
  • সমস্ত ফিল্ড (ভ্যালু) final হতে হবে।
  • কোন setter মেথড থাকতে পারবে না।
  • কন্সট্রাক্টরে কপি করা যাবে না বা কোন চেঞ্জ করতে হবে না (যেমন, ফিল্ডগুলির সরাসরি পরিবর্তন বা ভ্যালু পরিবর্তন করা যাবে না)।

উদাহরণ:

final class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

এখানে, Person ক্লাসটি final এবং এর সমস্ত ফিল্ড final যা একবার সেট করার পর পরিবর্তন করা সম্ভব নয়।

২. String Immutable কেন?

উত্তর: Java তে String ক্লাসটি Immutable হওয়ার কয়েকটি প্রধান কারণ রয়েছে:

১. String Pooling:

Java তে String ব্যবহৃত হয় একটি বিশেষ মেমরি সঞ্চয়ের মাধ্যমে যাকে String Pool বলা হয়। যখন একটি নতুন String তৈরি করা হয়, Java তা String Pool এ রাখে। String যদি Mutable হত, তাহলে একই String এর ভিন্ন ভিন্ন ভ্যালু তৈরি হতে পারত, যা String Pool-এর উদ্দেশ্যের সাথে সাংঘর্ষিক হত। Immutable String এর মাধ্যমে String Pool নিশ্চিত করে যে, একাধিক জায়গায় একই String অবজেক্ট ব্যবহার করা হয় এবং মেমরি ব্যবহারের দক্ষতা বাড়ে।

২. Thread Safety:

String Immutable হওয়ায় একাধিক থ্রেড একসাথে একটি String অবজেক্টের সাথে কাজ করলেও তা থ্রেড-সেফ থাকে। কারণ, যদি String Mutable হত, তবে একাধিক থ্রেড একযোগে String পরিবর্তন করার চেষ্টা করতে পারত, যা Race Condition এবং অন্যান্য সমস্যা সৃষ্টি করত। Immutable হওয়ায় এটি এমন ধরনের সমস্যা প্রতিরোধ করে।

৩. প্রদত্ত অবস্থা রক্ষা করা:

Immutable String এর কারণে, আপনি যেই String অবজেক্ট তৈরি করেছেন, তা কখনই পরিবর্তিত হবে না। এটি আপনাকে কোনো অবজেক্টকে সুরক্ষিত রাখতে এবং তার অবস্থা নিশ্চিত করতে সাহায্য করে। অর্থাৎ, String অবজেক্টের অবস্থা পূর্বে সেট করা থাকলে, তা কখনো পরিবর্তন হবে না।

৪. সাবলীলতা এবং পারফর্মেন্স:

String অবজেক্ট Immutable হওয়ার কারণে, আপনি String কে ক্যাশ বা ক্যাশিং এর মাধ্যমে পুনরায় ব্যবহার করতে পারবেন এবং এটি পদ্ধতিগত পারফর্মেন্স বৃদ্ধি করতে সাহায্য করে।

String Immutable হওয়ার প্রভাব এবং সুবিধা:

  • কনকারেন্সি: একাধিক থ্রেড একই String অবজেক্টের সাথে কাজ করলেও কোনো সমস্যা হয় না।
  • কম মেমরি ব্যবহার: String Pool ব্যবহার করার কারণে পুনঃব্যবহৃত String অবজেক্টের মাধ্যমে মেমরি সাশ্রয় হয়।
  • ভাল পারফরম্যান্স: Immutable অবজেক্টের কারণে, String কে সুরক্ষিতভাবে এবং দ্রুতগতিতে ব্যবহার করা যায়।
  • কমপ্লেক্স কোড কমানো: Immutable অবজেক্টগুলিতে কোনো ধরণের ডেটা পরিবর্তন করার সুযোগ না থাকায়, কোড অনেক সহজ এবং ট্র্যাক করা সহজ হয়।

৩. String Immutable হওয়ার কারণে কী কী সমস্যা এড়ানো যায়?

  1. Race Conditions: একাধিক থ্রেড একই String অবজেক্টের মান পরিবর্তন করার চেষ্টা করলে রেস কন্ডিশন হতে পারে। কিন্তু String Immutable থাকায় এই ধরনের সমস্যা এড়ানো যায়।
  2. Unintended Changes: Mutable String এর মাধ্যমে অবাঞ্ছিত পরিবর্তন হতে পারে, যা অবজেক্টের অবস্থা সঠিক রাখার ক্ষেত্রে সমস্যা সৃষ্টি করে। Immutable String এর মাধ্যমে এ ধরনের ভুল পরিবর্তন এড়ানো সম্ভব।
  3. Security Issues: String একসাথে বিভিন্ন জায়গায় ব্যবহৃত হতে পারে (যেমন, password বা sensitive information)। Immutable হওয়ায়, String-এর অবস্থা কখনই পরিবর্তিত হবে না, ফলে সুরক্ষা বাড়ে।

৪. StringBuilder এবং StringBuffer এর মধ্যে পার্থক্য কি?

StringBuilder এবং StringBuffer দুটোই Mutable (পরিবর্তনযোগ্য) ক্লাস। এগুলো Strings কে পরিবর্তনযোগ্য করতে ব্যবহৃত হয়, তবে String ক্লাসের বিপরীতে, তারা immutable নয়।

  • StringBuilder: থ্রেড-সেফ নয়, তবে অধিকতর দ্রুত।
  • StringBuffer: থ্রেড-সেফ, তবে StringBuilder এর চেয়ে কিছুটা ধীর।

উদাহরণ:

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb.toString());  // Output: Hello World

এখানে StringBuilder অবজেক্টটি পরিবর্তনযোগ্য এবং একই অবজেক্টে নতুন স্ট্রিং যুক্ত করা সম্ভব।

Immutable Objects (যেমন String) এমন অবজেক্ট যেগুলির একবার তৈরি হওয়া পর তার অবস্থা পরিবর্তন করা যায় না। String Immutable হওয়া নিশ্চিত করে যে, এটি ব্যবহারকারী, মেমরি এবং পারফরম্যান্সের জন্য নিরাপদ। String ক্লাসের Immutable হওয়া Java অ্যাপ্লিকেশনগুলোতে একাধিক থ্রেড এবং ডেটার নিরাপত্তা নিশ্চিত করতে সাহায্য করে।

Content added By
Promotion

Are you sure to start over?

Loading...