Polymorphism হল অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ ধারণা, যেখানে একটি ক্লাসের সাবক্লাসগুলির বিভিন্ন আচরণ (behavior) একসাথে কাজ করতে পারে। Jackson এ Polymorphism ব্যবহারের মাধ্যমে আমরা বিভিন্ন ধরনের অবজেক্টকে একই ধরনের রেফারেন্স বা ইন্টারফেসে মডেল করতে পারি এবং JSON Serialization এবং Deserialization এর সময় সঠিক ক্লাস ইনস্ট্যান্সে রূপান্তর করতে পারি।
Jackson এর মাধ্যমে Polymorphism-এর জন্য @JsonTypeInfo, @JsonSubTypes, এবং @JsonTypeName অ্যানোটেশনগুলি ব্যবহৃত হয়।
Jackson-এ Polymorphism ব্যবহারের জন্য প্রয়োজনীয় অ্যানোটেশনগুলি
@JsonTypeInfo:- এটি নির্ধারণ করে যে JSON ডেটাতে কোন তথ্য (যেমন, টাইপ ইনফরমেশন) সংরক্ষণ করা হবে এবং সেটা কিভাবে হবে।
@JsonSubTypes:- এটি Subtypes (সাবক্লাস) এর তালিকা প্রদান করে এবং তাদের নাম চিহ্নিত করে, যাতে Jackson সঠিক ক্লাস রূপান্তর করতে পারে।
@JsonTypeName:- এটি একটি নির্দিষ্ট সাবক্লাসের জন্য টাইপ ইনফরমেশন সেট করতে ব্যবহৃত হয়।
Jackson-এ Polymorphism এর উদাহরণ
১. @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করে Polymorphism
ধরা যাক, আমাদের কাছে একটি Vehicle প্যারেন্ট ক্লাস আছে এবং এর দুটি সাবক্লাস: Car এবং Truck। আমরা JSON-এ টাইপ ইনফরমেশন রাখতে চাই, যাতে Jackson সঠিক ক্লাসে রূপান্তর করতে পারে।
Java Class Example:
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, // Name-based polymorphism
include = JsonTypeInfo.As.PROPERTY, // Include type info as a property
property = "type" // The name of the property holding type information
)
@JsonSubTypes({
@JsonSubTypes.Type(value = Car.class, name = "car"),
@JsonSubTypes.Type(value = Truck.class, name = "truck")
})
public abstract class Vehicle {
private String brand;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
public class Car extends Vehicle {
private int seatingCapacity;
public int getSeatingCapacity() {
return seatingCapacity;
}
public void setSeatingCapacity(int seatingCapacity) {
this.seatingCapacity = seatingCapacity;
}
}
public class Truck extends Vehicle {
private int loadCapacity;
public int getLoadCapacity() {
return loadCapacity;
}
public void setLoadCapacity(int loadCapacity) {
this.loadCapacity = loadCapacity;
}
}
Serialization Example (Java to JSON):
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonPolymorphismExample {
public static void main(String[] args) throws Exception {
Car car = new Car();
car.setBrand("Toyota");
car.setSeatingCapacity(5);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(car);
System.out.println(json);
}
}
JSON Output:
{
"type": "car",
"brand": "Toyota",
"seatingCapacity": 5
}
Deserialization Example (JSON to Java):
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonPolymorphismExample {
public static void main(String[] args) throws Exception {
String json = "{\"type\":\"car\",\"brand\":\"Toyota\",\"seatingCapacity\":5}";
ObjectMapper mapper = new ObjectMapper();
Vehicle vehicle = mapper.readValue(json, Vehicle.class); // Automatically detects the type
System.out.println(vehicle.getClass().getSimpleName()); // Prints: Car
}
}
Output:
Car
২. @JsonTypeName ব্যবহার করে Polymorphism
@JsonTypeName অ্যানোটেশন ব্যবহৃত হয় একটি নির্দিষ্ট সাবক্লাসের জন্য টাইপ ইনফরমেশন সেট করতে।
Java Class Example:
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("car")
public class Car extends Vehicle {
private int seatingCapacity;
public int getSeatingCapacity() {
return seatingCapacity;
}
public void setSeatingCapacity(int seatingCapacity) {
this.seatingCapacity = seatingCapacity;
}
}
@JsonTypeName("truck")
public class Truck extends Vehicle {
private int loadCapacity;
public int getLoadCapacity() {
return loadCapacity;
}
public void setLoadCapacity(int loadCapacity) {
this.loadCapacity = loadCapacity;
}
}
এখানে, @JsonTypeName("car") এবং @JsonTypeName("truck") ব্যবহার করা হয়েছে, যা JSON-এর টাইপ হিসেবে car এবং truck ইনফরমেশন সংরক্ষণ করবে।
Serialization Example (Java to JSON):
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonPolymorphismExample {
public static void main(String[] args) throws Exception {
Truck truck = new Truck();
truck.setBrand("Volvo");
truck.setLoadCapacity(10000);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(truck);
System.out.println(json);
}
}
JSON Output:
{
"type": "truck",
"brand": "Volvo",
"loadCapacity": 10000
}
Deserialization Example (JSON to Java):
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonPolymorphismExample {
public static void main(String[] args) throws Exception {
String json = "{\"type\":\"truck\",\"brand\":\"Volvo\",\"loadCapacity\":10000}";
ObjectMapper mapper = new ObjectMapper();
Vehicle vehicle = mapper.readValue(json, Vehicle.class);
System.out.println(vehicle.getClass().getSimpleName()); // Prints: Truck
}
}
Output:
Truck
Polymorphism এবং Jackson-এ এর ব্যবহার:
@JsonTypeInfo: Jackson কে জানায় যে কিভাবে JSON ডেটাতে টাইপ ইনফরমেশন থাকবে (যেমন,typeফিল্ডেcarঅথবাtruckলেখা হবে)।@JsonSubTypes: Jackson কে জানায় যে কোন সাবক্লাসগুলি প্যারেন্ট ক্লাসের জন্য বৈধ এবং তাদের জন্য টাইপ নামগুলি কী হবে।@JsonTypeName: সাবক্লাসে টাইপ ইনফরমেশন সরাসরি ম্যানুয়ালি নির্ধারণ করতে ব্যবহৃত হয়।
- Polymorphism Jackson-এর মাধ্যমে খুব সহজে পরিচালনা করা যায়। এটি abstract এবং concrete ক্লাসগুলির মধ্যে সঠিকভাবে Serialization এবং Deserialization করার ক্ষমতা প্রদান করে।
@JsonTypeInfo,@JsonSubTypes, এবং@JsonTypeNameঅ্যানোটেশনগুলি Jackson-এ Polymorphism হ্যান্ডলিংয়ের জন্য শক্তিশালী টুল হিসেবে কাজ করে।- এটি API ডিজাইন এবং JSON ডেটা রূপান্তরের ক্ষেত্রে কার্যকরী, বিশেষ করে যখন আপনার একটি অ্যাপ্লিকেশনে বিভিন্ন ধরনের অবজেক্ট একত্রে কাজ করতে হয়।
Read more