java

How do I handle a process that does the same thing for 2 different objects with the same fields


First of all, I don't have control over the objects as they come from a 3rd party dependency.

They are just simple java objects for example

public class Object_A {
    private String foo;
    private String bar;
}

public class Object_B {
    private String foo;
    private String bar;
}

Now I have a code that would do the same thing for both this objects

private void processA(Object_A object) {
    //object.getFoo() do something
    //object.getBar() do something
}

private void processB(Object_B object) {
    //object.getFoo() do something
    //object.getBar() do something
}

How do I handle this to get rid of duplicate code?


Solution

  • You handle common functionality the same way you’d do if you had control over the classes, use an abstract class or an interface. Since you can’t change the classes to implement the interface directly, you have to resort to delegation.

    For example

    interface Common {
        String getFoo();
        void setFoo(String foo);
        String getBar();
        void setBar(String bar);
    }
    
    record ObjectAAdapter(Object_A a) implements Common {
        public String getFoo() {
            return a.getFoo();
        }
        public void setFoo(String foo) {
            a.setFoo(foo);
        }
        public String getBar() {
            return a.getBar();
        }
        public void setBar(String bar) {
            a.setBar(bar);
        }
    }
    
    record ObjectBAdapter(Object_B b) implements Common {
        public String getFoo() {
            return b.getFoo();
        }
        public void setFoo(String foo) {
            b.setFoo(foo);
        }
        public String getBar() {
            return b.getBar();
        }
        public void setBar(String bar) {
            b.setBar(bar);
        }
    }
    
    private void processA(Object_A object) {
        process(new ObjectAAdapter(object));
    }
    
    private void processB(Object_B object) {
        process(new ObjectBAdapter(object));
    }
    
    private void process(Common object) {
        //object.getFoo() do something
        //object.getBar() do something
    }
    

    However, in trivial cases like when you really only need to call getFoo() and getBar(), you can use a simpler alternative:

    private void processA(Object_A object) {
        process(object.getFoo(), object.getBar());
    }
    
    private void processB(Object_B object) {
        process(object.getFoo(), object.getBar());
    }
    
    private void process(String foo, String bar) {
        // foo do something
        // bar do something
    }