I am creating DTO structure with Builder pattern. Because of existence of many requests I created parent request AbstractRequest
to create concrete requests - e.g. ConcreteRequest
in this example.
Base Buildable
interface defines contract to all Requests.
public interface Buildable<T> {
T build();
void validate();
}
Parent request AbstractRequest
to create concrete ConcreteRequest
that holds parameters used by all descendants (for brevity globalValue
only in this example).
public abstract class AbstractRequest {
private final String globalValue;
public AbstractRequest(BuilderImpl builder) {
this.globalValue = builder.global;
}
public interface Builder<T> extends Buildable<T> {
Builder<T> globalValue(String globalValue);
}
public abstract static class BuilderImpl<T> implements Builder<T> {
private String global;
@Override
public Builder<T> globalValue(String globalValue) {
this.global = globalValue;
return this;
}
}
}
Concrete request that has one private parameter localValue
:
public final class ConcreteRequest extends AbstractRequest {
private final String localValue;
public ConcreteRequest(BuilderImpl builder) {
super(builder);
this.localValue = builder.localValue;
}
public String getLocalValue() {
return localValue;
}
public static Builder builder(){
return new BuilderImpl();
}
public interface Builder extends AbstractRequest.Builder<ConcreteRequest> {
Builder localValue(String localValue);
}
public static final class BuilderImpl extends AbstractRequest.BuilderImpl<ConcreteRequest> implements Builder {
private String localValue;
@Override
public ConcreteRequest build() {
this.validate();
return new ConcreteRequest(this);
}
@Override
public void validate() {
// do validation
}
@Override
public Builder localValue(String localValue) {
this.localValue = localValue;
return this;
}
}
}
Q: Why is not ConcreteRequest#getLocalValue
accessible while ConcreteRequest#build
is available?