Mapping Inheritance (Subclass Mapping)

Java Technologies - ম্যাপস্ট্রাক্ট (MapStruct)
115
115

MapStruct হল একটি Java annotation processor যা ডোমেইন অবজেক্টগুলির মধ্যে ম্যাপিং করার জন্য ব্যবহৃত হয়। এটি compile-time কোড জেনারেট করে, যা পারফরম্যান্স উন্নত করে এবং সাধারণ ম্যাপিং কাজগুলো দ্রুত সম্পন্ন করতে সহায়তা করে। Mapping Inheritance (Subclass Mapping) হল একটি এমন প্রক্রিয়া যেখানে মেভেনের ম্যাপিং ক্লাস সাবক্লাস (inheritance) ব্যবহার করে প্যারেন্ট ক্লাস থেকে ডেটা ম্যাপিং করা হয়।

MapStruct এ Inheritance Mapping ব্যবহৃত হয় যখন আপনি একটি প্যারেন্ট ক্লাসের ডেটা সাবক্লাসে ম্যাপ করতে চান, অথবা প্যারেন্ট ক্লাসের কিছু ফিল্ড সাবক্লাসে ম্যাপ করতে চান।

এটি মূলত Polymorphic Mapping নামে পরিচিত যেখানে প্যারেন্ট ক্লাস থেকে সাবক্লাসে ডেটা ট্রান্সফার হয়। MapStruct প্যারেন্ট এবং সাবক্লাসের জন্য আলাদা ম্যাপিং মেথড জেনারেট করতে পারে।


১. Inheritance Mapping এর ধারণা

Inheritance Mapping এ প্যারেন্ট ক্লাস এবং সাবক্লাসের মধ্যে একটি সম্পর্ক থাকে। এখানে, সাবক্লাসে প্যারেন্ট ক্লাসের সমস্ত ফিল্ড রয়েছে, এবং আপনি যদি প্যারেন্ট ক্লাস থেকে সাবক্লাসে ডেটা ম্যাপ করতে চান, তবে MapStruct এর মাধ্যমে এটি খুব সহজে করা যায়।

এখানে, একটি সাবক্লাসের জন্য প্যারেন্ট ক্লাসের ফিল্ড ম্যাপিং করা হবে, এবং এটি একই MapStruct Mapper ইন্টারফেস ব্যবহার করে সম্পন্ন করা হবে।


২. Inheritance Mapping এর উদাহরণ

ধরা যাক, আমাদের একটি Person প্যারেন্ট ক্লাস এবং তার একটি Employee সাবক্লাস রয়েছে। Employee ক্লাসের মধ্যে কিছু অতিরিক্ত ফিল্ড যেমন employeeId এবং department রয়েছে, তবে name এবং age ফিল্ডগুলি Person ক্লাস থেকে এসেছে।

Example: Parent Class Person এবং Subclass Employee

Person.java (Parent Class):

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

    // Getters and Setters
}

Employee.java (Subclass):

public class Employee extends Person {
    private String employeeId;
    private String department;

    // Getters and Setters
}

এখন, আমরা Person ক্লাস থেকে Employee ক্লাসে ডেটা ম্যাপ করতে চাই।


৩. MapStruct Mapper Interface (Inheritance Mapping)

এখানে, PersonMapper ইন্টারফেসে Person এবং Employee ক্লাসের মধ্যে ম্যাপিং ফাংশন থাকবে। আমাদের মূল লক্ষ্য হল, Person অবজেক্টকে Employee অবজেক্টে ম্যাপ করা।

PersonMapper.java:

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    // Mapping Person to Employee
    Employee personToEmployee(Person person);
}

এখানে, PersonMapper ইন্টারফেসে personToEmployee মেথডের মাধ্যমে Person থেকে Employee এ ম্যাপিং করা হচ্ছে। MapStruct স্বয়ংক্রিয়ভাবে প্যারেন্ট ক্লাসের ফিল্ড যেমন name এবং age সাবক্লাসে (Employee) ম্যাপ করবে।


৪. Usage Example (MapStruct with Inheritance Mapping)

এখন, Person অবজেক্টে ডেটা সেট করে এবং তার থেকে Employee অবজেক্টে ডেটা ম্যাপ করবো।

Main.java:

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("John Doe");
        person.setAge(30);

        // Using MapStruct Mapper
        Employee employee = PersonMapper.INSTANCE.personToEmployee(person);

        System.out.println("Employee Name: " + employee.getName());
        System.out.println("Employee Age: " + employee.getAge());
        System.out.println("Employee ID: " + employee.getEmployeeId()); // Should be null as it's not set
    }
}

এখানে, MapStruct personToEmployee মেথড ব্যবহার করে Person অবজেক্টের name এবং age ফিল্ড Employee অবজেক্টে ম্যাপ করবে। তবে, employeeId এবং department ফিল্ডগুলি Employee এর ফিল্ড হওয়ায় এটি null থাকবে, কারণ এগুলি Person ক্লাসের অংশ নয়।


৫. MapStruct এবং Inheritance Mapping এর সুবিধা

  1. Inheritance Mapping এর মাধ্যমে প্যারেন্ট এবং সাবক্লাসের মধ্যে ডেটা ট্রান্সফার সহজ করা যায়।
  2. Compile-time Code Generation: MapStruct কোড জেনারেট করে, যা পারফরম্যান্সের জন্য সুবিধাজনক।
  3. No Reflection: MapStruct সাধারণভাবে রিফ্লেকশন ব্যবহার করে না, ফলে পারফরম্যান্স উন্নত হয়।
  4. Custom Mapping: আপনি প্রয়োজন অনুযায়ী কাস্টম ম্যাপিং লজিক ব্যবহার করতে পারেন, যেমন সাবক্লাসের নির্দিষ্ট ফিল্ড ম্যাপিং করতে।

৬. Inheritance Mapping এবং Subclass Specific Mapping

MapStruct এর মাধ্যমে, আপনি প্যারেন্ট ক্লাসের ফিল্ড ম্যাপ করার পাশাপাশি সাবক্লাসে থাকা অতিরিক্ত ফিল্ডগুলির জন্য কাস্টম ম্যাপিংও করতে পারেন। উদাহরণস্বরূপ, যদি Employee ক্লাসে অতিরিক্ত একটি ফিল্ড থাকে যা Person থেকে পাওয়া যায় না, তবে আপনি সেটির জন্য কাস্টম ম্যাপিং যুক্ত করতে পারেন।

Custom Mapping Example:

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(target = "employeeId", expression = "java(\"EMP\" + person.getAge())")
    Employee personToEmployee(Person person);
}

এখানে, employeeId ফিল্ডের জন্য কাস্টম এক্সপ্রেশন ব্যবহার করা হয়েছে, যা age এর সাথে যুক্ত করে একটি আইডি তৈরি করবে।


সারাংশ

Inheritance Mapping বা Subclass Mapping হল একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা MapStruct এর মাধ্যমে আপনি প্যারেন্ট এবং সাবক্লাসের মধ্যে ডেটা ম্যাপ করতে পারেন। এটি আপনার JavaBeans এবং DTO (Data Transfer Object) এর মধ্যে ডেটা ট্রান্সফার প্রক্রিয়াকে আরও সহজ এবং কার্যকরী করে তোলে। MapStruct এর মাধ্যমে প্যারেন্ট ক্লাস থেকে সাবক্লাসে ডেটা ট্রান্সফার করা খুবই সহজ এবং কাস্টম ম্যাপিংয়ের জন্য সুবিধা প্রদান করে।


Content added By

Inheritance এর ধারণা এবং MapStruct এ এর ব্যবহার

59
59

MapStruct একটি Java-based mapping framework যা compile-time কোড জেনারেট করে, এবং এটি মডেল (DTO) এবং ডোমেইন অবজেক্টগুলির মধ্যে দ্রুত এবং কার্যকরী ম্যাপিং সম্পাদন করতে সহায়তা করে। Inheritance বা উত্তরাধিকার সম্পর্কিত ম্যাপিং হচ্ছে একটি ব্যাপক ফিচার, যেখানে আপনি একটি ক্লাসের বৈশিষ্ট্যগুলি উপরের ক্লাস থেকে উত্তরাধিকার হিসেবে গ্রহণ করেন এবং তারপরে সেগুলিকে ম্যাপ করতে পারেন।

MapStruct এ Inheritance এর মাধ্যমে, আপনি সুপারক্লাস এবং সাবক্লাসের মধ্যে ডেটা ম্যাপিং করতে পারেন, যা কাস্টম ম্যাপিং এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) ব্যবহারকে আরও সহজ এবং কার্যকরী করে তোলে।


১. Inheritance Concept in MapStruct

Inheritance হল একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণা, যেখানে একটি ক্লাস তার প্যারেন্ট ক্লাসের বৈশিষ্ট্য এবং আচরণ উত্তরাধিকারীভাবে গ্রহণ করে। MapStruct এ, Inheritance সাপোর্টের মাধ্যমে আপনি প্যারেন্ট ক্লাসের বৈশিষ্ট্যগুলিকে সাবক্লাসে ম্যাপ করতে পারেন।

উদাহরণ: Inheritance Concept

ধরা যাক, আমাদের একটি Person নামক সুপারক্লাস রয়েছে এবং এর একটি সাবক্লাস Employee রয়েছে, যেটি Person ক্লাসের বৈশিষ্ট্যগুলিকে ইনহেরিট করেছে।

// Superclass: Person
public class Person {
    private String name;
    private int age;

    // Getters and Setters
}

// Subclass: Employee
public class Employee extends Person {
    private String jobTitle;

    // Getters and Setters
}

এখানে, Employee ক্লাসের jobTitle ছাড়াও name এবং age প্যারেন্ট Person ক্লাস থেকে ইনহেরিট করা হয়েছে। এখন আমাদের Person এবং Employee এর মধ্যে ম্যাপিং করতে হবে।


২. MapStruct এ Inheritance ব্যবহার

MapStruct তে Inheritance ব্যবহার করতে হলে, এটি মূলত superclass (প্যারেন্ট ক্লাস) এবং subclass (সাবক্লাস) এর মধ্যে Object Mapping করতে ব্যবহৃত হয়। MapStruct স্বয়ংক্রিয়ভাবে প্যারেন্ট ক্লাসের ফিল্ডগুলো সাবক্লাসে ম্যাপ করতে পারে, তবে সাবক্লাসের জন্য কিছু অতিরিক্ত কাস্টম ম্যাপিং ফাংশন হতে পারে।

উদাহরণ: MapStruct Mapper Interface

ধরা যাক, আমাদের Person এবং Employee এর মধ্যে ম্যাপিং করতে হবে।

PersonMapper.java (MapStruct Interface):

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PersonMapper {

    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    // Mapping Person to Employee (Inheritance)
    @Mapping(source = "name", target = "fullName")
    Employee personToEmployee(Person person);
}

এখানে, আমরা Person ক্লাসের name ফিল্ডকে Employee ক্লাসের fullName ফিল্ডে ম্যাপ করেছি। MapStruct প্যারেন্ট ক্লাসের অন্যান্য ফিল্ড (যেমন age) ম্যাপ করবে স্বয়ংক্রিয়ভাবে, এবং কোনো কাস্টম ম্যাপিংয়ের প্রয়োজন না হলে আপনি এটি বাদ দিতে পারেন।


৩. Inheritance with Superclass and Subclass Mapping

ধরা যাক, আপনি যদি Person এবং Employee এর মধ্যে আরো বিস্তারিতভাবে ম্যাপিং করতে চান (যেমন, Employee এর jobTitle এর জন্য কাস্টম ম্যাপিং), তবে আপনি সেই অনুযায়ী কাস্টম ম্যাপিং কোড তৈরি করতে পারেন।

উদাহরণ: Inheritance with Subclass-Specific Mapping

// Superclass: Person
public class Person {
    private String name;
    private int age;
    
    // Getters and Setters
}

// Subclass: Employee
public class Employee extends Person {
    private String jobTitle;
    
    // Getters and Setters
}

// MapStruct Mapper
@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    // Mapping Person to Employee (with custom jobTitle mapping)
    @Mapping(source = "name", target = "fullName")
    @Mapping(source = "jobTitle", target = "position")
    Employee personToEmployee(Person person);
}

এখানে, name এবং jobTitle ফিল্ডগুলোকে Employee এর fullName এবং position ফিল্ডে ম্যাপ করা হচ্ছে।


৪. Inheritance with Interface Mapping

MapStruct ইনহেরিটেড ইন্টারফেসও সাপোর্ট করে। আপনি যদি একটি ইন্টারফেসের মাধ্যমে একাধিক ক্লাস ম্যাপ করতে চান, তবে এটি খুবই সহজ।

উদাহরণ: Inheritance with Interface Mapping

// Superclass Interface: Person
public interface Person {
    String getName();
    int getAge();
}

// Subclass: Employee
public class Employee implements Person {
    private String name;
    private int age;
    private String jobTitle;

    // Getters and Setters
}

// Mapper Interface
@Mapper
public interface PersonMapper {

    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    // Mapping Person to Employee
    @Mapping(source = "name", target = "fullName")
    @Mapping(source = "jobTitle", target = "position")
    Employee personToEmployee(Person person);
}

এখানে, Person ইন্টারফেস এবং Employee ক্লাসের মধ্যে MapStruct ম্যাপিং করা হয়েছে, যেখানে PersonMapper মেথডের মাধ্যমে ম্যাপিং করা হচ্ছে।


৫. Inheritance with Multiple Levels

MapStruct একাধিক স্তরের ইনহেরিটেন্স সাপোর্ট করে, অর্থাৎ আপনি যদি একাধিক স্তরের ক্লাস হিরার্কি (যেমন: Grandparent, Parent, Child) ব্যবহার করেন, তবে আপনি এগুলোর মধ্যে ম্যাপিং করতে পারবেন।

উদাহরণ: Multiple Level Inheritance

// Grandparent Class
public class Grandparent {
    private String familyName;

    // Getters and Setters
}

// Parent Class inheriting Grandparent
public class Parent extends Grandparent {
    private String firstName;

    // Getters and Setters
}

// Child Class inheriting Parent
public class Child extends Parent {
    private String nickname;

    // Getters and Setters
}

এখন, MapStruct এর মাধ্যমে এই একাধিক স্তরের ক্লাসগুলোর মধ্যে ডেটা ম্যাপিং করা যেতে পারে।

@Mapper
public interface FamilyMapper {

    FamilyMapper INSTANCE = Mappers.getMapper(FamilyMapper.class);

    @Mapping(source = "familyName", target = "lastName")
    @Mapping(source = "firstName", target = "firstName")
    Child parentToChild(Parent parent);
}

এখানে, FamilyMapper মাপারের মাধ্যমে Parent থেকে Child এর মধ্যে ডেটা ম্যাপিং করা হয়েছে।


৬. MapStruct এবং Inheritance এর সুবিধা

  1. Code Reusability: ইনহেরিটেন্স ব্যবহারের মাধ্যমে আপনি একাধিক ক্লাসের মধ্যে কোড পুনরায় ব্যবহার করতে পারেন।
  2. Ease of Maintenance: ইনহেরিটেড ক্লাসের মধ্যে মডেল ম্যাপিং সহজে পরিবর্তনযোগ্য হয়, কারণ একবার প্যারেন্ট ক্লাসের ম্যাপিং কনফিগার করলে তা সাবক্লাসে প্রযোজ্য হবে।
  3. Custom Mapping: সাবক্লাসের জন্য প্রয়োজনীয় কাস্টম ম্যাপিং যুক্ত করা সহজ হয়, যা ডেটা ট্রান্সফার অবজেক্ট (DTO) বা ডোমেইন অবজেক্টের মধ্যে ম্যাপিংকে আরও উন্নত করে।

সারাংশ

Inheritance MapStruct এ একটি শক্তিশালী বৈশিষ্ট্য যা প্যারেন্ট ক্লাস এবং সাবক্লাসের মধ্যে ডেটা ম্যাপিং করতে সহায়তা করে। MapStruct এর মাধ্যমে ইনহেরিটেড ক্লাসগুলির মধ্যে ডেটা ট্রান্সফার অবজেক্ট (DTO) বা ডোমেইন অবজেক্টগুলির মধ্যে দ্রুত এবং কার্যকরী ম্যাপিং করা যায়। এটি কোড পুনরায় ব্যবহার, কাস্টম ম্যাপিং, এবং সহজ রক্ষণাবেক্ষণ নিশ্চিত করে। MapStruct ইনহেরিটেন্সের মাধ্যমে বিভিন্ন স্তরের ক্লাস হিরার্কি, ইন্টারফেস এবং মেথডের মধ্যে সুনির্দিষ্টভাবে ম্যাপিং সম্পাদন করতে সক্ষম।


Content added By

Subclass এবং Superclass এর মধ্যে Mapping

70
70

MapStruct একটি Java annotation processor ব্যবহার করে ডোমেইন অবজেক্ট (POJOs) এর মধ্যে ম্যাপিং সম্পাদন করে। এক্ষেত্রে, যদি আপনার Superclass এবং Subclass থাকে এবং আপনি তাদের মধ্যে ম্যাপিং করতে চান, MapStruct তাও সহজে সমাধান করতে পারে। Subclass এবং Superclass এর মধ্যে Mapping এর উদ্দেশ্য হল, সুপারক্লাস এবং সাবক্লাসের মধ্যে ডেটা ট্রান্সফার করার প্রক্রিয়া।

MapStruct এ Inheritance Mapping খুবই সহজ এবং এটি @Mapping অ্যানোটেশন ব্যবহার করে কনফিগার করা যায়, যেখানে সাবক্লাসের ডেটা সুপারক্লাসে বা সুপারক্লাসের ডেটা সাবক্লাসে ম্যাপ করা হয়।

১. Superclass এবং Subclass এর মধ্যে Mapping এর ধারণা

MapStruct কে ব্যবহার করে, আপনি Superclass এবং Subclass এর মধ্যে ম্যাপিং করতে পারেন। MapStruct এর মাধ্যমে, আপনি Superclass থেকে Subclass অথবা Subclass থেকে Superclass তে ডেটা ম্যাপিং করতে পারবেন। এটি একটি সাধারণ মডেল মেপিং প্রক্রিয়া যা inheritance (উত্তরাধিকার) এর ভিত্তিতে কাজ করে।

২. Superclass এবং Subclass Example

ধরা যাক, আমাদের কাছে একটি Superclass (Parent Class) এবং একটি Subclass (Child Class) রয়েছে, এবং আমাদের এই দুটি ক্লাসের মধ্যে ম্যাপিং করতে হবে।

উদাহরণ ১: Superclass এবং Subclass

Superclass (Person.java)
public class Person {
    private String name;
    private int age;

    // Getters and Setters
}
Subclass (Employee.java)
public class Employee extends Person {
    private String department;

    // Getters and Setters
}

এখানে, Employee ক্লাসটি Person ক্লাসকে extends করে, তাই Employee ক্লাসে Person ক্লাসের সব ফিল্ড (name, age) মিরর করা হবে।

MapStruct Mapper Interface

এখন, আমাদের একটি Mapper Interface তৈরি করতে হবে যা Person এবং Employee ক্লাসের মধ্যে ম্যাপিং করবে।

PersonEmployeeMapper.java
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PersonEmployeeMapper {
    PersonEmployeeMapper INSTANCE = Mappers.getMapper(PersonEmployeeMapper.class);

    // Mapping method from Person to Employee
    @Mapping(source = "name", target = "name")
    @Mapping(source = "age", target = "age")
    @Mapping(target = "department", constant = "IT")  // Example of setting a constant value for department
    Employee personToEmployee(Person person);

    // Mapping method from Employee to Person (If needed)
    @Mapping(source = "name", target = "name")
    @Mapping(source = "age", target = "age")
    Person employeeToPerson(Employee employee);
}

Code Explanation:

  1. personToEmployee মেথডে, Person অবজেক্টকে Employee অবজেক্টে ম্যাপ করা হয়েছে।
  2. @Mapping অ্যানোটেশন ব্যবহার করে আপনি ফিল্ড ম্যাপিং কনফিগার করেছেন।
  3. Department ফিল্ডে, আমরা একটি constant মান সেট করেছি (যেমন "IT")।

এভাবে, আপনি Superclass এবং Subclass এর মধ্যে ডেটা ম্যাপিং করতে পারেন। উপরে দেওয়া উদাহরণে, আমরা Person থেকে Employee তে এবং Employee থেকে Person তে ডেটা ম্যাপ করেছি।


৩. Superclass এবং Subclass এর মধ্যে Mapping এর সুবিধা

  1. Inheritance Support: MapStruct স্বয়ংক্রিয়ভাবে Superclass এবং Subclass এর মধ্যে ফিল্ড এবং বৈশিষ্ট্য সমন্বিত করতে পারে।
  2. Reuse Mapping Code: আপনি Superclass এর জন্য একটি সাধারণ ম্যাপিং কোড তৈরি করতে পারেন, এবং সেটি Subclass এর জন্যও ব্যবহার করতে পারবেন।
  3. Type Safety: MapStruct টাইপ সেফটি নিশ্চিত করে, যাতে Superclass এবং Subclass এর মধ্যে ভুল ম্যাপিং না হয়।
  4. Compile-time code generation: এটি রানটাইম ওভারহেড কমায়, কারণ MapStruct কোড জেনারেট করে compile-time এ।

৪. Additional Considerations for Inheritance Mapping

MapStruct ইনহেরিটেন্স (Inheritance) ম্যাপিংয়ের ক্ষেত্রে কিছু অতিরিক্ত বৈশিষ্ট্য সরবরাহ করে:

  1. Polymorphic Mapping: যদি Person বা তার সাবক্লাস Employee এমন ডোমেইন অবজেক্টগুলির মধ্যে polymorphic সম্পর্ক থাকে, তবে MapStruct সেই সম্পর্ক অনুযায়ী উপযুক্ত ম্যাপিং করতে সক্ষম।
  2. Constructor-based Mapping: যদি আপনি কোনও constructor-based mapping করতে চান, তবে @Mapping অ্যানোটেশন ব্যবহার করে কাস্টম কনস্ট্রাক্টর সিলেক্ট করা যেতে পারে।

উদাহরণ: Polymorphic Mapping

@Mapper
public interface PolymorphicMapper {
    @Mapping(source = "name", target = "name")
    @Mapping(source = "age", target = "age")
    Person polymorphicToPerson(Employee employee);
}

এখানে, Employee থেকে Person এ পোলিমরফিক ম্যাপিং করার চেষ্টা করা হচ্ছে।


৫. Conclusion

MapStruct কে ব্যবহার করে Superclass এবং Subclass এর মধ্যে ম্যাপিং করা খুবই সহজ। এটি ডোমেইন অবজেক্টগুলির মধ্যে inheritance সম্পর্কিত ডেটা ট্রান্সফার বা ম্যাপিং করার জন্য একটি শক্তিশালী উপায় প্রদান করে। MapStruct এর সাহায্যে আপনি @Mapping অ্যানোটেশন ব্যবহার করে এবং compile-time code generation সুবিধার মাধ্যমে সুপারক্লাস এবং সাবক্লাসের মধ্যে খুব সহজে এবং দ্রুত ডেটা ম্যাপ করতে পারবেন।


Content added By

Polymorphic Mapping এর উদাহরণ

66
66

Polymorphic Mapping হল MapStruct এর একটি বৈশিষ্ট্য যা আপনাকে বিভিন্ন ক্লাসের অবজেক্টগুলির মধ্যে ম্যাপিং করতে সহায়তা করে, যখন তারা একই বেস ক্লাস বা ইন্টারফেস থেকে উৎসাহিত হয়। এটি সাধারণত এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে আপনি একাধিক সাব ক্লাস বা ইন্টারফেসের মধ্যে ডেটা ট্রান্সফার করতে চান, কিন্তু আপনি বেস ক্লাস বা ইন্টারফেসের সাধারণ ফাংশনালিটি ব্যবহার করতে চান।

MapStruct এর মাধ্যমে polymorphic mapping করতে হলে, আপনাকে সঠিকভাবে @Mapping অ্যানোটেশন ব্যবহার করতে হবে এবং Inheritance বা Interfaces এর মাধ্যমে ম্যাপিং সম্পন্ন করতে হবে।


১. Polymorphic Mapping এর ধারণা

Polymorphic Mapping এমন একটি প্রক্রিয়া যেখানে আপনি একটি base class বা interface এবং তার subclasses বা implementations এর মধ্যে ম্যাপিং করেন। যদি আপনি একটি List বা Set থেকে ডেটা ম্যাপ করতে চান এবং তার মধ্যে বিভিন্ন ধরনের অবজেক্ট থাকে (যেমন একটি বেস ক্লাসের বিভিন্ন সাবক্লাস), তাহলে Polymorphic Mapping ব্যবহৃত হয়।

উদাহরণ:

ধরা যাক, আমাদের একটি বেস ক্লাস Employee রয়েছে এবং তার দুটি সাব ক্লাস Manager এবং Developer রয়েছে। আমাদের উদ্দেশ্য হলো, Employee এর একটি সাব ক্লাসকে অন্য এক ডেটা ট্রান্সফার অবজেক্টে (DTO) ম্যাপ করা।


২. Polymorphic Mapping এর জন্য ডোমেইন ক্লাস তৈরি করা

Employee.java (Base class):

public class Employee {
    private String name;
    private int age;

    // Getters and Setters
}

Manager.java (Sub class):

public class Manager extends Employee {
    private String department;

    // Getters and Setters
}

Developer.java (Sub class):

public class Developer extends Employee {
    private String programmingLanguage;

    // Getters and Setters
}

এখানে, Employee হল বেস ক্লাস এবং ManagerDeveloper হল সাব ক্লাস।


৩. DTO ক্লাস তৈরি করা

এখন আমরা EmployeeDTO, ManagerDTO, এবং DeveloperDTO তৈরি করব, যা আমাদের ট্রান্সফার অবজেক্ট (DTO) হবে।

EmployeeDTO.java (DTO):

public class EmployeeDTO {
    private String name;
    private int age;

    // Getters and Setters
}

ManagerDTO.java (DTO):

public class ManagerDTO extends EmployeeDTO {
    private String department;

    // Getters and Setters
}

DeveloperDTO.java (DTO):

public class DeveloperDTO extends EmployeeDTO {
    private String programmingLanguage;

    // Getters and Setters
}

এখানে, ManagerDTO এবং DeveloperDTO EmployeeDTO থেকে এক্সটেন্ড করা হয়েছে।


৪. MapStruct Mapper Interface

এখন, আমরা MapStruct Mapper ইন্টারফেস তৈরি করব, যা বেস ক্লাস এবং তার সাব ক্লাসের মধ্যে ম্যাপিং করবে।

EmployeeMapper.java:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface EmployeeMapper {
    EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);

    // Polymorphic Mapping
    EmployeeDTO employeeToEmployeeDTO(Employee employee);
    
    ManagerDTO managerToManagerDTO(Manager manager);

    DeveloperDTO developerToDeveloperDTO(Developer developer);
}

এখানে:

  • employeeToEmployeeDTO মেথডটি Employee এর সমস্ত সাব ক্লাসের জন্য কাজ করবে।
  • managerToManagerDTO এবং developerToDeveloperDTO মেথড দুটি নির্দিষ্ট ক্লাসের জন্য ম্যাপিং করবে।

৫. Polymorphic Mapping এর ব্যবহারের উদাহরণ

এখন আমরা EmployeeMapper ইন্টারফেস ব্যবহার করে polymorphic mapping করব। এই উদাহরণে, আমরা Employee, Manager, এবং Developer এর মধ্যে ডেটা ট্রান্সফার করব।

Main.java (Usage):

public class Main {
    public static void main(String[] args) {
        // Creating Manager object
        Manager manager = new Manager();
        manager.setName("John Doe");
        manager.setAge(45);
        manager.setDepartment("Engineering");

        // Creating Developer object
        Developer developer = new Developer();
        developer.setName("Jane Smith");
        developer.setAge(30);
        developer.setProgrammingLanguage("Java");

        // Polymorphic Mapping
        EmployeeDTO managerDTO = EmployeeMapper.INSTANCE.employeeToEmployeeDTO(manager);
        EmployeeDTO developerDTO = EmployeeMapper.INSTANCE.employeeToEmployeeDTO(developer);

        System.out.println("Manager DTO: " + managerDTO.getName() + ", " + managerDTO.getAge());
        System.out.println("Developer DTO: " + developerDTO.getName() + ", " + developerDTO.getAge());
    }
}

এখানে, employeeToEmployeeDTO মেথডটি Manager এবং Developer উভয়ের ক্ষেত্রেই কাজ করবে, কারণ এটি polymorphic mapping-এর জন্য প্রস্তুত।


৬. Polymorphic Mapping এর ফলাফল

এই কোড চালানোর পর, EmployeeMapper এর মাধ্যমে Manager এবং Developer অবজেক্টগুলির EmployeeDTO তে ম্যাপিং হবে এবং তাদের তথ্য আউটপুট হবে।

আউটপুট:

Manager DTO: John Doe, 45
Developer DTO: Jane Smith, 30

এখানে, EmployeeMapper বেস ক্লাস Employee এবং তার সাব ক্লাস Manager এবং Developer এর মধ্যে polymorphic ম্যাপিং সম্পন্ন করেছে।


৭. Polymorphic Mapping এর সুবিধা

  1. Reuse: একটি base class বা interface এর মাধ্যমে ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ম্যাপিং করার ফলে কোড পুনরায় ব্যবহারযোগ্য হয়।
  2. Simplified Code: একাধিক সাব ক্লাসের জন্য পৃথক ম্যাপিং মেথড না লিখে, polymorphic mapping ব্যবহারের মাধ্যমে আপনি কোডের সংখ্যা কমাতে পারেন।
  3. Maintainability: যখন নতুন সাব ক্লাস যোগ করা হয়, তখন আপনাকে শুধুমাত্র একটি সাধারণ ম্যাপিং মেথডেই পরিবর্তন করতে হবে, যা সহজে রক্ষণাবেক্ষণযোগ্য।

সারাংশ

Polymorphic Mapping MapStruct এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একাধিক সাব ক্লাসের মধ্যে ডেটা ট্রান্সফার করতে সহায়তা করে। এই কৌশলের মাধ্যমে, আপনি base class বা interface ব্যবহার করে subclasses এর মধ্যে ম্যাপিং কার্যক্রম সম্পন্ন করতে পারেন। এতে কোডের পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি পায়, এবং একাধিক ম্যাপিং মেথড লেখার প্রয়োজনীয়তা কমে।


Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion