【发布时间】:2018-10-23 21:21:51
【问题描述】:
我正在使用 Lombok 框架进行样板代码生成,例如:
import lombok.*;
@Builder
@Value
public final class SocketConfig {
@Builder.Default
private int soTimeoutMilliseconds = 0;
@Builder.Default
private boolean soReuseAddress = false;
@Builder.Default
private int soLingerSeconds = -1;
private boolean soKeepAlive;
@Builder.Default
private boolean tcpNoDelay = false;
}
为了创建构建器实例,我曾经调用SocketConfig.builder()。但为了更好地与 spring bean 创建集成,我尝试创建一个FactoryBean。但是由于构建器类上缺少默认构造函数而导致编译错误,没有找到任何有关它的文档。龙目岛可以吗?我的意思是在构建器上而不是在原始类上创建一个默认构造函数。换句话说,我需要 2 个选项来创建构建器实例:SocketConfig.builder() 或通过 new SocketConfig.SocketConfigBuilder()。
import org.springframework.beans.factory.FactoryBean;
public class SocketConfigFactoryBean extends SocketConfig.SocketConfigBuilder implements FactoryBean<SocketConfig> {
@Override
public SocketConfig getObject() throws Exception {
return build();
}
@Override
public Class<?> getObjectType() {
return SocketConfig.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
【问题讨论】:
-
不要扩展
SocketConfig.SocketConfigBuilder只是封装它。 -
在这种情况下,我还需要维护当前类中的所有字段名称。
-
不,你没有。在工厂内创建一个
builder,并简单地公开属性的设置器,这些设置器直接在封装的构建器上设置值。