【问题标题】:Add default public constructor to generated builder inner class将默认公共构造函数添加到生成的构建器内部类
【发布时间】: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,并简单地公开属性的设置器,这些设置器直接在封装的构建器上设置值。

标签: java spring lombok


【解决方案1】:

使用注解NoArgsConstructor

生成一个无参数的构造函数。将生成错误消息,如果 由于 final 的存在,无法编写这样的构造函数 字段。

Read also this.

【讨论】:

  • 这将在原始类而不是内部构建器类上生成构造函数。
  • 那么this answer 可能会对您有所帮助。感谢@MaximKirilov 的评论。
  • 它不会,它会在构造的类上生成2个构造函数。我想要 2 个选项来创建构建器实例:“SocketConfig.builder()”或通过“new SocketConfig.SocketConfigBuilder()”
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多