Immutable objects হল এমন অবজেক্ট যা তার তৈরি হওয়ার পর থেকে পরিবর্তন করা যায় না। একবার একটি অবজেক্ট তৈরি হলে তার অবস্থা অপরিবর্তনীয় (unchangeable) থাকে। Java Time API-এর অনেক ক্লাস, যেমন LocalDate, LocalDateTime, ZonedDateTime, Instant, ইত্যাদি, সবই immutable। এর মানে হলো, আপনি একবার একটি অবজেক্ট তৈরি করার পরে, তার অবস্থা বা মান পরিবর্তন করতে পারবেন না।
Immutable objects সম্পর্কে ধারণা এবং তাদের পারফরম্যান্সের সুবিধা সম্পর্কে এই পোস্টে আলোচনা করা হবে।
Immutable Objects in Java
Immutable objects সাধারণত thread-safe (থ্রেড সেফ) হয়ে থাকে, কারণ তাদের অবস্থা কখনো পরিবর্তিত হয় না। এই ধরনের অবজেক্টের মধ্যে state পরিবর্তন না হওয়ায় একাধিক থ্রেড একই অবজেক্টে কাজ করতে পারে এবং তাদের পারফরম্যান্সে কোনো নেতিবাচক প্রভাব পড়ে না।
Java Time API-তে Immutable Objects
Java Time API-তে LocalDate, LocalDateTime, Instant, ZonedDateTime, Duration, Period ইত্যাদি সবই immutable ক্লাস। এগুলোর মধ্যে একবার অবজেক্ট তৈরি করার পর তার মান পরিবর্তন করা সম্ভব নয়। উদাহরণস্বরূপ:
LocalDate: একটি তারিখ (দিন, মাস, বছর) প্রতিনিধিত্ব করে।ZonedDateTime: একটি নির্দিষ্ট তারিখ এবং সময়, টাইমজোন সহ।Instant: UTC-এ একটি নির্দিষ্ট মুহূর্ত।
এগুলোর প্রতিটি ক্লাসেই immutable ডিজাইন রয়েছে, যার ফলে আপনি নতুন মান তৈরি করতে পারলেও পুরনো অবজেক্ট পরিবর্তন করতে পারবেন না।
Immutable Objects এর সুবিধা
- Thread-Safety:
- যেহেতু Immutable objects কখনো পরিবর্তিত হয় না, সুতরাং এগুলো thread-safe। একাধিক থ্রেড একসাথে কাজ করলেও কোনো ডেটা করাপশন বা সমস্যা হবে না। এটি multithreading এর ক্ষেত্রে খুবই কার্যকরী, কারণ এখানে কোন synchronization এর দরকার হয় না।
- Performance:
- Immutable objects এর পরিবর্তনে কষ্ট কম থাকে, কারণ আপনি নতুন অবজেক্ট তৈরি করতে পারেন, কিন্তু পুরনো অবজেক্টের অবস্থা পরিবর্তন হয় না। এতে garbage collection এবং memory management ভালভাবে কাজ করে।
- Reuse: Immutable objects এর ব্যবহারে বারবার একই অবজেক্ট ব্যবহার করা যায়, ফলে memory usage কম থাকে।
- Easier to Debug:
- Immutable objects এ অবস্থা পরিবর্তন না হওয়ার কারণে এগুলি সহজে ডিবাগ করা যায়। যেমন, যখন কোনো অবজেক্টের অবস্থা পরিবর্তিত হয়, তখন আপনি জানেন না কীভাবে বা কোথায় সেটা পরিবর্তন হয়েছে, কিন্তু immutable objects এর ক্ষেত্রে এটা সমস্যা তৈরি করে না।
- Safe Sharing:
- একাধিক থ্রেড বা ক্লাস যখন একই immutable object শেয়ার করে, তখন কোনো প্রতিকূল প্রভাব না পড়লে তাদের মধ্যে data race বা inconsistent state তৈরি হয় না। এটি safe sharing নিশ্চিত করে।
Java Time API Immutable Objects এর পারফরম্যান্স
Java Time API-তে immutable অবজেক্টের পারফরম্যান্স বেশ ভালো। তবে, এটি কিছু নির্দিষ্ট কেসে এক্সট্রা অবজেক্ট ক্রিয়েশন করতে পারে, যেমন আপনি যখন LocalDate বা LocalDateTime এ কোনো পরিবর্তন করতে চান, তখন একটি নতুন অবজেক্ট তৈরি হয়। এটি হয়তো memory allocation বাড়াতে পারে, তবে এর পারফরম্যান্স সাধারণত উন্নত, বিশেষত multi-threaded environments-এ।
Immutable Objects পারফরম্যান্সে প্রভাব
- Object Creation Overhead:
- Immutable objects এর ক্ষেত্রে অবজেক্ট তৈরির জন্য কিছু অতিরিক্ত ওভারহেড হতে পারে, কারণ প্রতিটি পরিবর্তনের জন্য নতুন অবজেক্ট তৈরি করতে হয়। তবে, এই ওভারহেডটি সাধারণত নগণ্য এবং JVM (Java Virtual Machine) এর সাথে খুব ভালোভাবে অপটিমাইজ করা থাকে।
- Cacheability:
- Immutable objects অনেক সময় ক্যাশিংয়ের জন্য উপযোগী হতে পারে, কারণ তাদের অবস্থা পরিবর্তিত না হওয়ার কারণে এগুলি পুনরায় ব্যবহার করা সহজ হয়। Java Time API তে
LocalDateTimeবাZonedDateTimeইত্যাদি অ্যাবস্ট্রাক্ট টাইপগুলো বারবার একই মান ব্যবহার করতে সক্ষম।
- Immutable objects অনেক সময় ক্যাশিংয়ের জন্য উপযোগী হতে পারে, কারণ তাদের অবস্থা পরিবর্তিত না হওয়ার কারণে এগুলি পুনরায় ব্যবহার করা সহজ হয়। Java Time API তে
- Optimized for Thread Safety:
- Immutable objects নিজেই thread-safe হওয়ায় synchronization এর প্রয়োজন পড়ে না। একাধিক থ্রেড যখন একই অবজেক্টে কাজ করে, তখন ডেটা কোন্ফ্লিক্টের কোনো সম্ভাবনা থাকে না। এটি কার্যকরীভাবে CPU ব্যবহার এবং পারফরম্যান্স বৃদ্ধি করতে সহায়ক।
Immutable Objects: Example in Java Time API
LocalDate এবং ZonedDateTime এর উদাহরণ হিসেবে দেখা যাক কিভাবে immutable objects কাজ করে:
Example: LocalDate (Immutable)
import java.time.LocalDate;
public class ImmutableObjectExample {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2024, 12, 23);
System.out.println("Original date: " + date1);
// Modify the date by adding 5 days, which will return a new object
LocalDate date2 = date1.plusDays(5);
System.out.println("Modified date (after adding 5 days): " + date2);
// Verify that original date remains unchanged
System.out.println("Original date remains unchanged: " + date1);
}
}
Output:
Original date: 2024-12-23
Modified date (after adding 5 days): 2024-12-28
Original date remains unchanged: 2024-12-23
ব্যাখ্যা:
- এখানে,
LocalDateএকটি immutable অবজেক্ট। যখনdate1.plusDays(5)মেথডটি কল করা হয়েছে, তখন একটি নতুনLocalDateঅবজেক্ট তৈরি হয়েছে, কিন্তুdate1অপরিবর্তিত রয়েছে।
Example: ZonedDateTime (Immutable)
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class ImmutableZonedDateTimeExample {
public static void main(String[] args) {
ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println("Original ZonedDateTime: " + zonedDateTime1);
// Modify the ZonedDateTime by adding 3 hours
ZonedDateTime zonedDateTime2 = zonedDateTime1.plusHours(3);
System.out.println("Modified ZonedDateTime (after adding 3 hours): " + zonedDateTime2);
// Verify that original ZonedDateTime remains unchanged
System.out.println("Original ZonedDateTime remains unchanged: " + zonedDateTime1);
}
}
Output:
Original ZonedDateTime: 2024-12-23T10:30:15.123456-05:00[America/New_York]
Modified ZonedDateTime (after adding 3 hours): 2024-12-23T13:30:15.123456-05:00[America/New_York]
Original ZonedDateTime remains unchanged: 2024-12-23T10:30:15.123456-05:00[America/New_York]
ব্যাখ্যা:
ZonedDateTimeএকটি immutable অবজেক্ট। যখন আপনিplusHours()মেথড ব্যবহার করেন, এটি একটি নতুনZonedDateTimeঅবজেক্ট তৈরি করে, এবং পুরনো অবজেক্ট অপরিবর্তিত থাকে।
- Immutable objects হল এমন অবজেক্ট যা তৈরি হওয়ার পর থেকে কোনো পরিবর্তন হয় না, এবং Java Time API-তে
LocalDate,ZonedDateTime,Instantএবং অন্যান্য টাইম ক্লাসগুলি immutable। - Thread-safety এবং performance এর ক্ষেত্রে immutable objects অনেক সুবিধা প্রদান করে, যেমন no need for synchronization এবং safe sharing।
- Immutable objects পারফরম্যান্সের উপর তেমন নেতিবাচক প্রভাব ফেলে না, কারণ Java Virtual Machine (JVM) এই ধরনের অবজেক্টগুলিকে অপটিমাইজ করে।
- Java Time API-তে immutable objects ব্যবহার করার ফলে কোড অনেক সঠিক, নিরাপদ এবং সহজে রক্ষণাবেক্ষণযোগ্য হয়।
Immutable objects ব্যবহারের মাধ্যমে সময় এবং তারিখ সম্পর্কিত কাজগুলো আরও কার্যকরী এবং সঠিকভাবে সম্পন্ন করা যায়।
Read more