📘 Premium Read: Access my best content on Medium member-only articles — deep dives into Java, Spring Boot, Microservices, backend architecture, interview preparation, career advice, and industry-standard best practices.
✅ Some premium posts are free to read — no account needed. Follow me on Medium to stay updated and support my writing.
🎓 Top 10 Udemy Courses (Huge Discount): Explore My Udemy Courses — Learn through real-time, project-based development.
▶️ Subscribe to My YouTube Channel (172K+ subscribers): Java Guides on YouTube
Intent
Source code
Class diagram
public abstract class Converter < T, C > {
private final Function < T,
C > fromDto;
private final Function < C,
T > fromEntity;
/**
* @param fromDto
* Function that converts given dto entity into the domain
* entity.
* @param fromEntity
* Function that converts given domain entity into the dto
* entity.
*/
public Converter(final Function < T, C > fromDto, final Function < C, T > fromEntity) {
this.fromDto = fromDto;
this.fromEntity = fromEntity;
}
/**
* @param customerDto
* DTO entity
* @return The domain representation - the result of the converting function
* application on dto entity.
*/
public final C convertFromDto(final T customerDto) {
return fromDto.apply(customerDto);
}
/**
* @param customer
* domain entity
* @return The DTO representation - the result of the converting function
* application on domain entity.
*/
public final T convertFromEntity(final C customer) {
return fromEntity.apply(customer);
}
/**
* @param dtoCustomers
* collection of DTO entities
* @return List of domain representation of provided entities retrieved by
* mapping each of them with the conversion function
*/
public final List < C > createFromDtos(final Collection < T > dtoCustomers) {
return dtoCustomers.stream().map(this::convertFromDto).collect(Collectors.toList());
}
/**
* @param customers
* collection of domain entities
* @return List of domain representation of provided entities retrieved by
* mapping each of them with the conversion function
*/
public final List < T > createFromEntities(final Collection < C > customers) {
return customers.stream().map(this::convertFromEntity).collect(Collectors.toList());
}
}
public class CustomerConverter extends Converter<CustomerDto, Customer> {
public CustomerConverter() {
super(customerDto -> new Customer(customerDto.getCustomerId(), customerDto.getCustomerName(),
customerDto.getCustomerLastName(), customerDto.isStatus()),
customer -> new CustomerDto(customer.getCustomerId(), customer.getCustomerName(),
customer.getCustomerLastName(), customer.isStatus()));
}
}
public class CustomerDto {
private String customerId;
private String customerName;
private String customerLastName;
private boolean status;
public CustomerDto(String customerId, String customerName, String customerLastName, boolean status) {
super();
this.customerId = customerId;
this.customerName = customerName;
this.customerLastName = customerLastName;
this.status = status;
}
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerLastName() {
return customerLastName;
}
public void setCustomerLastName(String customerLastName) {
this.customerLastName = customerLastName;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
}
public class Customer {
private String customerId;
private String customerName;
private String customerLastName;
private boolean status;
public Customer(String customerId, String customerName, String customerLastName, boolean status) {
super();
this.customerId = customerId;
this.customerName = customerName;
this.customerLastName = customerLastName;
this.status = status;
}
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerLastName() {
return customerLastName;
}
public void setCustomerLastName(String customerLastName) {
this.customerLastName = customerLastName;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
}
public class Client {
/**
* Program entry point
*
* @param args command line args
*/
public static void main(String[] args) {
Converter < CustomerDto, Customer > CustomerConverter = new CustomerConverter();
CustomerDto dtoCustomer = new CustomerDto("100", "Ramesh", "Fadatare", true);
Customer Customer = CustomerConverter.convertFromDto(dtoCustomer);
System.out.println("Entity converted from DTO:" + Customer);
List < Customer > customers = new ArrayList < > ();
customers.add(new Customer("100", "Ramesh1", "Fadatare", true));
customers.add(new Customer("200", "Ramesh2", "Fadatare", true));
customers.add(new Customer("300", "Ramesh3", "Fadatare", true));
customers.forEach(System.out::println);
customers.forEach((customer) - > System.out.println(customer.getCustomerId()));
System.out.println("DTO entities converted from domain:");
List < CustomerDto > dtoEntities = CustomerConverter.createFromEntities(customers);
dtoEntities.forEach(System.out::println);
dtoEntities.forEach((customer) - > System.out.println(customer.getCustomerId()));
}
}
Entity converted from DTO:com.ramesh.j2ee.converter.Customer@87aac27
com.ramesh.j2ee.converter.Customer@1b28cdfa
com.ramesh.j2ee.converter.Customer@eed1f14
com.ramesh.j2ee.converter.Customer@7229724f
100
200
300
DTO entities converted from domain:
com.ramesh.j2ee.converter.CustomerDto@4dd8dc3
com.ramesh.j2ee.converter.CustomerDto@6d03e736
com.ramesh.j2ee.converter.CustomerDto@568db2f2
100
200
300
Applicability
- When you have types that logically correspond which other and you need to convert entities between them
- When you want to provide different ways of types conversions depending on a context
- Whenever you introduce a DTO (Data transfer object), you will probably need to convert it into the domain equivalence.
Related Patterns
- Data Transfer Object Design Pattern in Java
- Service Locator Design Pattern in Java
- Business Delegate Design Pattern in Java
- Converter Design Pattern in Java
- Transfer Object Assembler Pattern in Java
- Value List Handler Pattern in Java
Thanks for sharing this great source of information. Click here here for some great stuff
ReplyDeleteGrateful for the help, but I'm having trouble converting objects. For example: TeacherDto is inside my ClassroomDto object. And to convert, I end up having problems because I can't invoke conversion methods inside the DTO object.
ReplyDelete