Polymorphism হলো একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর একটি মৌলিক ধারণা, যেখানে একাধিক শ্রেণী (class) একই ধরনের ইন্টারফেস বা বেস ক্লাস (base class) কে অনুসরণ করে এবং সেই শ্রেণীগুলি ভিন্ন ভিন্ন আচরণ করতে পারে। Gson-এ polymorphic objects ব্যবহৃত হয় যখন আপনার JSON ডেটা একটি বেস ক্লাস বা ইন্টারফেসের মাধ্যমে একাধিক কাস্টম টাইপ (subclass) ধারণ করে, এবং আপনি ঐ ডেটাকে JSON থেকে Java অবজেক্টে রূপান্তর করতে চান।
Polymorphic Objects বা Polymorphism হল এমন অবজেক্ট যেগুলি বিভিন্ন উপ subclass-এ ডাটা রাখে, কিন্তু আপনি এই subclass গুলিকে একই superclass হিসাবে ব্যবহার করতে পারেন। Gson-এ polymorphic object ম্যানিপুলেট করতে হলে, আপনাকে subclass গুলিকে সঠিকভাবে ডেসেরিয়ালাইজ বা সিরিয়ালাইজ করতে হবে।
Polymorphic Object কী?
Polymorphic object এমন একটি অবজেক্ট যা একই বেস ক্লাসের (superclass) মাধ্যমে একাধিক সাবক্লাস (subclass) ধারণ করে। সাধারণত, এই প্রক্রিয়াটি ব্যবহার হয় যখন আপনার JSON ডেটা বেস ক্লাস বা ইন্টারফেসের মাধ্যমে একাধিক subclass নিয়ে কাজ করে।
উদাহরণ হিসেবে, আপনি যদি একাধিক ধরণের গাড়ি (Car) ধারণ করতে চান যেমন Sedan, SUV, এবং Truck, তবে আপনি একটি বেস ক্লাস হিসেবে Car ব্যবহার করতে পারেন এবং প্রতিটি গাড়ির ধরনকে একটি subclass হিসেবে তৈরি করতে পারেন।
Gson-এ Polymorphic Object কেন প্রয়োজন?
- একাধিক সাবক্লাসের মধ্যে সাধারণ আচরণ বজায় রাখা: যখন আপনার একই বেস ক্লাসের মাধ্যমে বিভিন্ন ধরনের অবজেক্টকে ম্যানেজ করতে হয়, তখন polymorphism খুবই উপকারী। Gson-এর মাধ্যমে আপনি JSON ডেটা থেকে একাধিক টাইপকে রূপান্তর করতে পারেন এবং সেগুলিকে একটি সাধারণ টাইপ (বেস ক্লাস) হিসেবে ম্যানিপুলেট করতে পারবেন।
- ডায়নামিক টাইপ সিলেকশন: Polymorphism দিয়ে আপনি একাধিক সাবক্লাসের মধ্যে ডায়নামিক টাইপ সিলেকশন করতে পারেন। এটি তখন ব্যবহৃত হয় যখন আপনি জানেন না JSON ডেটাতে কোন টাইপ থাকবে এবং আপনি সেটি runtime এ সিদ্ধান্ত নিতে চান।
- JSON থেকে অবজেক্টের ধরন সঠিকভাবে রূপান্তর করা: Polymorphic object ব্যবহার করলে JSON ডেটা থেকে বিভিন্ন subtype অবজেক্ট সঠিকভাবে রূপান্তর করা সহজ হয়, বিশেষ করে যখন JSON ডেটা কোনও টাইপ নির্দিষ্ট না করে থাকে (যেমন, একটি
"type"ফিল্ড দিয়ে সাবক্লাসের ধরন নির্ধারণ করা)।
Polymorphic Object Mapping in Gson
Gson-এ polymorphic object ম্যানিপুলেট করার জন্য সাধারণত TypeAdapter বা JsonDeserializer ব্যবহার করা হয়। Gson এর কাস্টম টাইপ অ্যাডাপ্টার এর মাধ্যমে আপনি JSON ডেটার মধ্যে polymorphic objects সঠিকভাবে রূপান্তর করতে পারেন।
Polymorphic Object Mapping Example:
ধরি, আমাদের একটি Vehicle বেস ক্লাস এবং তার কয়েকটি সাবক্লাস আছে।
- বেস ক্লাস (Vehicle) এবং সাবক্লাস (Car, Bike):
abstract class Vehicle {
String brand;
public Vehicle(String brand) {
this.brand = brand;
}
abstract void drive();
}
class Car extends Vehicle {
int doors;
public Car(String brand, int doors) {
super(brand);
this.doors = doors;
}
@Override
void drive() {
System.out.println("Driving a car");
}
}
class Bike extends Vehicle {
boolean hasCarrier;
public Bike(String brand, boolean hasCarrier) {
super(brand);
this.hasCarrier = hasCarrier;
}
@Override
void drive() {
System.out.println("Riding a bike");
}
}
- JSON Example (Polymorphic Data with Type):
{
"type": "car",
"brand": "Toyota",
"doors": 4
}
এখানে, "type" ফিল্ডটি JSON ডেটা থেকে বুঝতে সাহায্য করবে যে এটি একটি Car টাইপের অবজেক্ট।
- Gson-এ Polymorphic Object Mapping (TypeAdapter):
Gson এর TypeAdapter ব্যবহার করে, আপনি polymorphic objects সঠিকভাবে ডেসেরিয়ালাইজ করতে পারেন। নিচে এর উদাহরণ দেখানো হলো:
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
class VehicleDeserializer implements JsonDeserializer<Vehicle> {
@Override
public Vehicle deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String type = jsonObject.get("type").getAsString();
if ("car".equals(type)) {
return new Gson().fromJson(json, Car.class); // Car object
} else if ("bike".equals(type)) {
return new Gson().fromJson(json, Bike.class); // Bike object
}
return null;
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"type\":\"car\", \"brand\":\"Toyota\", \"doors\":4}";
// Gson with TypeAdapter for polymorphic objects
Gson gson = new GsonBuilder()
.registerTypeAdapter(Vehicle.class, new VehicleDeserializer())
.create();
// Deserialize JSON to Vehicle object (polymorphic)
Vehicle vehicle = gson.fromJson(json, Vehicle.class);
vehicle.drive(); // It will call the Car's drive method
}
}
আউটপুট:
Driving a car
এখানে, VehicleDeserializer ব্যবহার করে JSON ডেটা থেকে সঠিক Car বা Bike অবজেক্ট ডেসেরিয়ালাইজ করা হয়েছে। "type" ফিল্ডের মান দেখে নির্ধারণ করা হয়েছে যে এটি কোন subclass হবে।
Polymorphic Object Mapping using @JsonAdapter (Simpler Approach)
আপনি @JsonAdapter অ্যানোটেশন ব্যবহার করেও একই কাজ করতে পারেন:
@JsonAdapter(VehicleDeserializer.class)
abstract class Vehicle {
String brand;
public Vehicle(String brand) {
this.brand = brand;
}
abstract void drive();
}
এখানে, @JsonAdapter অ্যানোটেশনটি VehicleDeserializer টাইপ অ্যাডাপ্টার ব্যবহার করে polymorphic ডেসেরিয়ালাইজেশন সরাসরি করাতে সাহায্য করবে।
সারাংশ:
- Polymorphic Object হল এমন অবজেক্ট যা একাধিক সাবক্লাস ধারণ করে, এবং JSON ডেটার মধ্যে টাইপ নির্ধারণ করে আপনি ঐ ডেটাকে বিভিন্ন ধরনের অবজেক্টে রূপান্তর করতে পারেন।
- Gson polymorphic objects ডেসেরিয়ালাইজ করতে TypeAdapter অথবা
@JsonAdapterঅ্যানোটেশন ব্যবহার করতে সাহায্য করে। - Polymorphism খুবই উপকারী যখন আপনার JSON ডেটাতে একাধিক টাইপ থাকে এবং আপনি সেগুলোকে বেস ক্লাসের মাধ্যমে পরিচালনা করতে চান।
Read more