1

Let's say I have an interface and 2 classes like this:

public interface FinancialTransactionBuilder {
    FinancialTransactionBuilder cost(int cost);
    FinancialTransactionBuilder dateOfPurchase(Date date);
    FinancialTransactionBuilder customer(Customer customer);
}
@Builder 
public class ProductPurchaseInstance{
    int cost;
    Date dateOfPurchase;
    Customer customer;
    String productSerialNumber;
}
@Builder 
public class ServicePurchaseInstance {
    int cost;
    Date dateOfPurchase;
    Customer customer;
    Service serviceSold;
}

So the classes have 3 common fields cost, dateOfPurchase, and customer, and the interface is something that the builders for both of those classes can implement.

Is there a way for me to specify in the lombok @Builder or @SuperBuilder annotations that the builder is implementing some interface methods?

Before someone asks "Why would you do this?", it's because I'm working in a codebase with 2 very similar models, and the logic to append data to the builders for those 2 classes was very complex duplicated code. As of now, I wrote out all the boiler plate builder code in order to make a single method that uses the interface for appending data. But I'd like to use the annotations so that the boiler plate doesn't have to be updated whenever the data model changes.

Or...do I just have to go and make an abstract parent class that goes and has the common fields and use the @SuperBuilder annotation?

SomeGuy
  • 1,702
  • 1
  • 20
  • 19

1 Answers1

5

There is; make the builder yourself. Lombok will 'fill in' automatically:

@Builder
public class ServicePurchase {
    int cost;
    Date dateOfPurchase;
    Customer customer;
    Service serviceSold;

    public static class ServicePurchaseBuilder implements FinancialTransactionBuilder {}
}

Lombok will still generate everything else, hence why the contents of your builder class can remain empty.

rzwitserloot
  • 85,357
  • 5
  • 51
  • 72
  • Wow, I had no idea you can partially define whatever Lombok Builder was going to do. I took it a step further and overwrote a couple of the builder methods too and it worked like a charm. – SomeGuy Mar 29 '22 at 21:41