Java-তে Immutable Objects এমন ক্লাসগুলোর ইনস্ট্যান্স, যা একবার তৈরি হলে পরিবর্তন করা যায় না। Immutable ক্লাস তৈরির সাধারণ বৈশিষ্ট্যগুলোর মধ্যে থাকে:
- ক্লাসটি final হওয়া।
- ফিল্ডগুলো final হওয়া।
- কোনো setter মেথড না থাকা।
- কনস্ট্রাক্টর দিয়ে ফিল্ডগুলো নির্ধারণ করা।
Jackson লাইব্রেরি Immutable Objects-এর সাথে কাজ করতে পারে এবং যথাযথ পদ্ধতিতে Serialization ও Deserialization নিশ্চিত করে।
Serialization of Immutable Objects
Immutable Objects এর Serialization করা সহজ। Jackson স্বয়ংক্রিয়ভাবে Getter মেথডগুলো ব্যবহার করে JSON তৈরির জন্য।
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
public class ImmutableSerializationExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
// Immutable Object তৈরি
ImmutableUser user = new ImmutableUser(1, "Rahim", "rahim@example.com");
// Object থেকে JSON
String json = objectMapper.writeValueAsString(user);
System.out.println("Serialized JSON: " + json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// Immutable Class
final class ImmutableUser {
private final int id;
private final String name;
private final String email;
public ImmutableUser(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
}
আউটপুট:
Serialized JSON: {"id":1,"name":"Rahim","email":"rahim@example.com"}
Deserialization of Immutable Objects
Deserialization করার সময় Jackson ডিফল্টভাবে ডিফল্ট কনস্ট্রাক্টর (no-args constructor) ব্যবহার করে এবং setter মেথড কল করে। কিন্তু Immutable Objects-এ এগুলো থাকে না।
এই সমস্যার সমাধানের জন্য আমরা @JsonCreator এবং @JsonProperty এনোটেশন ব্যবহার করতে পারি।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ImmutableDeserializationExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
// JSON String
String json = "{\"id\":1,\"name\":\"Rahim\",\"email\":\"rahim@example.com\"}";
// JSON থেকে Object
ImmutableUser user = objectMapper.readValue(json, ImmutableUser.class);
System.out.println("Deserialized User: " + user.getName() + " - " + user.getEmail());
} catch (Exception e) {
e.printStackTrace();
}
}
}
// Immutable Class
final class ImmutableUser {
private final int id;
private final String name;
private final String email;
@JsonCreator
public ImmutableUser(
@JsonProperty("id") int id,
@JsonProperty("name") String name,
@JsonProperty("email") String email) {
this.id = id;
this.name = name;
this.email = email;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
}
আউটপুট:
Deserialized User: Rahim - rahim@example.com
গুরুত্বপূর্ণ পয়েন্ট
- Serialization:
- Immutable Objects-এ
getterমেথড থাকলেই Jackson JSON তৈরি করতে পারে। - ফিল্ডের অ্যাক্সেস সরাসরি প্রয়োজন হয় না।
- Immutable Objects-এ
- Deserialization:
- ডিফল্ট কনস্ট্রাক্টর না থাকলে
@JsonCreatorব্যবহার করতে হবে। - প্রতিটি ফিল্ডের জন্য
@JsonPropertyব্যবহার করতে হবে।
- ডিফল্ট কনস্ট্রাক্টর না থাকলে
Factory Method ব্যবহার করে Deserialization
আপনি Factory Method দিয়ে Immutable Object তৈরি করতে পারেন। এ ক্ষেত্রে @JsonCreator সরাসরি Factory Method-এর উপর প্রয়োগ করা হয়।
উদাহরণ:
final class ImmutableUser {
private final int id;
private final String name;
private final String email;
private ImmutableUser(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
@JsonCreator
public static ImmutableUser createUser(
@JsonProperty("id") int id,
@JsonProperty("name") String name,
@JsonProperty("email") String email) {
return new ImmutableUser(id, name, email);
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
}
Record ব্যবহার করে Immutable Objects
Java 14+ থেকে, Records ব্যবহার করে সহজে Immutable Objects তৈরি করা যায়। Jackson Records-এর সাথে সহজেই কাজ করতে পারে।
উদাহরণ:
import com.fasterxml.jackson.databind.ObjectMapper;
public class RecordExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
// JSON String
String json = "{\"id\":1,\"name\":\"Rahim\",\"email\":\"rahim@example.com\"}";
// JSON থেকে Record Object
UserRecord user = objectMapper.readValue(json, UserRecord.class);
System.out.println("Deserialized User Record: " + user.name());
} catch (Exception e) {
e.printStackTrace();
}
}
}
record UserRecord(int id, String name, String email) {}
আউটপুট:
Deserialized User Record: Rahim
- Immutable Objects-এ Serialization স্বাভাবিকভাবে হয়, কারণ
getterমেথড ব্যবহার হয়। - Deserialization-এ
@JsonCreatorএবং@JsonPropertyপ্রয়োজন। - Java 14+ এ Records ব্যবহার করে Immutable Objects তৈরি করা আরও সহজ।
- Factory Method এবং কনস্ট্রাক্টর দুই ক্ষেত্রেই Jackson সহজেই কাজ করতে পারে।
Read more