Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generic Builder in Java

I created a builder for a lookup table and using it as shown below.

public class RaceCodeDataBuilder {

    private RaceCode raceCode;  

    public RaceCodeDataBuilder() {
        raceCode = new RaceCode();
    }

    public RaceCodeDataBuilder code(String code) {
        raceCode.setCode(code);     
        return this;
    }

    public RaceCodeDataBuilder displayName(String displayName) {
        raceCode.setDisplayName(displayName);
        return this;
    }

    public RaceCode build() {
        return raceCode;
    }

}

Using this builder in a test:

   RaceCode mockRaceCode = new RaceCodeDataBuilder()
                         .code("2054-5")
                         .displayName("Black or African American")
                         .build();

I am expecting lot more similar builders for other look up tables such as StateCodeBuilder, GenderCodeBuilder and all of them have just "code" and "displayName", similar to above builder.

I want to create a generic builder and avoid creating several builder classes doing the same job with different name.

I attempted something in generics but I am way off..

public class CodeDataBuilder<T>{

    private T t;    

    public CodeDataBuilder(T t) {
        this.t = t;
    }

    public CodeDataBuilder code(String code) {
        raceCode.setCode(code);     // Cant write T.setCode here for obvious resons
        return this;
    }

    public CodeDataBuilder displayName(String displayName) {
        raceCode.setDisplayName(displayName); // Cant write T.setDisplayNamehere for obvious resons
        return this;
    }

    public T build() {
        return t;
    }

}

Can someone help me with that?

Thank you.

like image 558
Himalay Majumdar Avatar asked Nov 14 '25 19:11

Himalay Majumdar


1 Answers

Create an interface BuildableCodeData with the methods you need, and implement it with classes like RaceData.

Your code will then look like:

public interface BuildableCodeData {

  public void setCode(String code);

  public void setDisplayName(String name);
}

public class Builder<T extends BuildableCodeData> {
  private T codeData;

  public Builder(T codeData) {
    this.codeData = codeData;
  }

  public Builder<T> setCode(String code) {
    codeData.setCode(code);
    return this;
  }

  public Builder<T> setDisplayName(String displayName) {
    codeData.setDisplayName(displayName);
    return this;
  }

  public T build() {
    return codeData;
  }
}
like image 159
abraabra Avatar answered Nov 17 '25 18:11

abraabra



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!