MapStruct একটি শক্তিশালী টুল যা JavaBeans এবং DTO (Data Transfer Objects) এর মধ্যে ম্যাপিং কাজ সম্পন্ন করে। Enum Mapping MapStruct এর মাধ্যমে খুবই সহজ এবং কার্যকরীভাবে করা যেতে পারে। Enum হল একটি ডাটা টাইপ যা সীমিত সংখ্যক কনস্ট্যান্ট ভ্যালু ধারণ করে। কখনও কখনও, আমাদের প্রয়োজন হয় একটি String কে Enum এ এবং আবার একটি Enum কে String এ ম্যাপ করার, যা MapStruct সহজে সমাধান করে।
এখানে, আমরা দেখব কিভাবে String থেকে Enum এবং Enum থেকে String ম্যাপিং করা যায় MapStruct এর মাধ্যমে।
১. Enum Mapping এর প্রয়োজনীয়তা
Enum ম্যাপিং তখন প্রয়োজন হয় যখন আপনি একটি String ভ্যালুকে একটি Enum ভ্যালুতে কনভার্ট করতে চান বা বিপরীতটি করতে চান, উদাহরণস্বরূপ:
- String ("ACTIVE", "INACTIVE") কে Enum এর মানে পরিণত করা।
- Enum (এমনকি সিস্টেমে কোন কনস্ট্যান্ট) কে String রূপে প্রেরণ বা স্টোর করা।
এটি সাধারণত DTOs এবং Entity Models এর মধ্যে ডেটা এক্সচেঞ্জে ব্যবহৃত হয়, যেখানে String এবং Enum এর মধ্যে সঠিক রূপান্তর নিশ্চিত করা প্রয়োজন।
২. String থেকে Enum এবং Enum থেকে String Mapping উদাহরণ
ধরা যাক আমাদের একটি Status নামক enum রয়েছে এবং আমরা এটি একটি স্ট্রিং হিসেবে মান গ্রহণ বা ফেরত দিতে চাই।
২.১ Enum Definition (Status)
public enum Status {
ACTIVE,
INACTIVE,
PENDING;
}
এখানে, Status নামক enum তে তিনটি ভ্যালু আছে: ACTIVE, INACTIVE, PENDING।
২.২ DTO Class (Destination Object)
public class UserDTO {
private String name;
private Status status; // This will be mapped from String or vice versa
// Getters and Setters
}
এখানে, UserDTO ক্লাসে একটি Status enum রয়েছে যা ম্যাপ হবে String থেকে এবং এর বিপরীতে।
২.৩ Mapper Interface (MapStruct Interface)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface UserMapper {
// String to Enum mapping
@Mapping(source = "status", target = "status")
UserDTO userToUserDTO(User user);
// Enum to String mapping
@Mapping(source = "status", target = "status")
User userDTOToUser(UserDTO userDTO);
}
এখানে, MapStruct ব্যবহার করা হয়েছে status ফিল্ডের জন্য String থেকে Enum এবং Enum থেকে String ম্যাপিং করতে। MapStruct স্বয়ংক্রিয়ভাবে ACTIVE, INACTIVE, PENDING এর মতো স্ট্রিংগুলোকে Status enum এ এবং enum মানগুলোকে স্ট্রিং এ ম্যাপ করবে।
২.৪ Model Class (Source Object)
public class User {
private String name;
private String status; // This is a String value that will be converted to Enum
// Getters and Setters
}
এখানে, User ক্লাসের status একটি স্ট্রিং হিসাবে সংরক্ষিত হবে, যা Status Enum এর সাথে ম্যাপ হবে।
৩. Mapping Process
এখন, উদাহরণস্বরূপ, নিচের মতো একটি কনভার্সন প্রক্রিয়া চলবে।
৩.১ Main Class (Testing the Mapper)
public class Main {
public static void main(String[] args) {
User user = new User();
user.setName("John Doe");
user.setStatus("ACTIVE");
UserMapper userMapper = Mappers.getMapper(UserMapper.class);
// String to Enum mapping
UserDTO userDTO = userMapper.userToUserDTO(user);
System.out.println("Mapped UserDTO Status (Enum): " + userDTO.getStatus());
// Enum to String mapping
User userFromDTO = userMapper.userDTOToUser(userDTO);
System.out.println("Mapped User Status (String): " + userFromDTO.getStatus());
}
}
এখানে, MapStruct দুটি ম্যাপিং অপারেশন সম্পন্ন করবে:
- String to Enum:
user.setStatus("ACTIVE")এর মাধ্যমেACTIVEস্ট্রিংটিStatus.ACTIVEEnum এ ম্যাপ হবে। - Enum to String:
userDTO.getStatus()এর মাধ্যমে Enum মানটিACTIVEস্ট্রিং হিসেবে ফেরত আসবে।
৩.২ Output
Mapped UserDTO Status (Enum): ACTIVE
Mapped User Status (String): ACTIVE
এখানে, প্রথমে String থেকে Enum এবং তারপর Enum থেকে String সফলভাবে ম্যাপ করা হয়েছে।
৪. Custom Enum Mapping (কাস্টম Enum Mapping)
ম্যাপস্ট্রাক্টে String to Enum এবং Enum to String ম্যাপিং কাস্টম লজিক দিয়ে কাস্টমাইজও করা যেতে পারে। উদাহরণস্বরূপ, যদি আপনি একটি String এর মানের উপর ভিত্তি করে Enum ভ্যালু ম্যাপ করতে চান, তাহলে MapStruct এর মাধ্যমে @Mapping অ্যানোটেশনের সাহায্যে কাস্টম ম্যাপিং করা সম্ভব।
৪.১ Custom Mapping Example
@Mapper
public interface UserMapper {
// Custom Mapping from String to Enum with custom logic
@Mapping(source = "status", target = "status")
@Mapping(target = "status", expression = "java(mapStatus(user.getStatus()))")
UserDTO userToUserDTO(User user);
default Status mapStatus(String status) {
switch (status.toUpperCase()) {
case "ACTIVE":
return Status.ACTIVE;
case "INACTIVE":
return Status.INACTIVE;
default:
return Status.PENDING; // Default case
}
}
}
এখানে, mapStatus মেথডটি কাস্টম ম্যাপিং লজিক সরবরাহ করছে, যা String এর উপর ভিত্তি করে Enum ভ্যালু নির্ধারণ করে।
সারাংশ
MapStruct এর মাধ্যমে String থেকে Enum এবং Enum থেকে String ম্যাপিং খুবই সহজ এবং কার্যকরীভাবে করা যায়। @Mapping অ্যানোটেশন ব্যবহার করে আপনি সাধারণ ম্যাপিং এবং কাস্টম ম্যাপিং উভয়ই করতে পারেন। কাস্টম ম্যাপিংয়ের মাধ্যমে আপনি আপনার ডোমেইন অনুযায়ী লজিক প্রয়োগ করতে পারেন এবং String এর ভিত্তিতে Enum মান নির্ধারণ করতে পারেন।