Skip to content

Instantly share code, notes, and snippets.

@isicju
Created May 2, 2022 20:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save isicju/78b8f94ef163681a49166cc5e6bf5871 to your computer and use it in GitHub Desktop.
Save isicju/78b8f94ef163681a49166cc5e6bf5871 to your computer and use it in GitHub Desktop.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.google.gson.Gson;
import java.util.Arrays;
public class Refactoring {
final static Converter<Object, String> JSON_CONVERTER = (object) -> {
Gson gson = new Gson();
return gson.toJson(object);
};
final static Converter<Object, String> XML_CONVERTER = (object) -> {
XmlMapper xmlMapper = new XmlMapper();
try {
return xmlMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
};
public static void main(String[] args) throws Exception {
Employee regularEmployee = new Employee(39983, 20000, JSON_CONVERTER);
Contractor contractor = new Contractor(1111, 60000, 5000, XML_CONVERTER);
Arrays.asList(regularEmployee, contractor).forEach(
employee -> {
employee.makePayment();
employee.printReport();
}
);
}
@FunctionalInterface
interface Converter<T, R> {
R serialize(T var1);
}
static class Employee {
Converter<Object,String> converter;
int accountNumber;
int salary;
public int getAccountNumber() {
return accountNumber;
}
public int getSalary() {
return salary;
}
public Employee(int accountNumber, int salary, Converter<Object,String> converter) {
this.accountNumber = accountNumber;
this.salary = salary;
this.converter = converter;
}
public void printReport() {
System.out.println("printing regular employee details in json format: "
+ converter.serialize(this));
}
public void makePayment() {
System.out.println("Processing payment for " + accountNumber + " amount: " + (salary));
}
}
static class Contractor extends Employee {
int commission;
public int getCommission() {
return commission;
}
public Contractor(int accountNumber, int salary, int commission, Converter<Object,String> converter) {
super(accountNumber, salary, converter);
this.commission = commission;
}
@Override
public void makePayment() {
System.out.println("Processing payment for " + accountNumber
+ " amount: " + (salary - commission));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment