当前位置: 首页 > news >正文

做网站 用什么建站软件好做网站前端用什么软件

做网站 用什么建站软件好,做网站前端用什么软件,劳务公司找工程网,seowhy官网现在很多程序员都习惯使用Lombok来使代码更加 “简洁”。但是使用Lombok也会造成很多问题,尤其Builder 有个很大的坑,已经见过好几次由于使用Builder注解导致默认值失效的问题,如果测试时没有在意这个问题,就很容易引发线上问题。…

现在很多程序员都习惯使用Lombok来使代码更加 “简洁”。但是使用Lombok也会造成很多问题,尤其@Builder 有个很大的坑,已经见过好几次由于使用@Builder注解导致默认值失效的问题,如果测试时没有在意这个问题,就很容易引发线上问题。

问题复现

我们随便定义一个类Config,对其中两个属性设置默认值。

import lombok.Builder;
import lombok.Data;@Data
@Builder
public class Config {private boolean isOpen = true;private String name;private int value = 20;
}public class LombokDemo {public static void main(String[] args) {Config config = Config.builder().name("test").build();System.out.println(config);}
}

借助Builder模式创建Config类实例时,仅设置name属性,然后打印出实例

public class LombokDemo {public static void main(String[] args) {Config config = Config.builder().name("test").build();System.out.println(config);}
}

输出结果如下。

Config(isOpen=false, name=test, value=0)

我们为isOpen及value属性设置的默认值失效了。

原因分析

想了解为什么会这样,我们只需要查看使用Lombok的注解后的Config类的 class文件长啥样就明白了。@Builder通过Lombok的注解处理器,在编译时会自动生成一个静态内部类,这个内部类就是所谓的builder类,它包含了和被注解的类中的属性一一对应的setter方法,并且在build()方法中返回一个被注解的类的对象。这个builder类的代码实现是通过Lombok生成的,所以我们不需要手动编写。


public class Config {private boolean isOpen = true;private String name;private int value = 20;Config(boolean isOpen, String name, int value) {this.isOpen = isOpen;this.name = name;this.value = value;}public static ConfigBuilder builder() {return new ConfigBuilder();}public boolean isOpen() {return this.isOpen;}public String getName() {return this.name;}public int getValue() {return this.value;}public void setOpen(boolean isOpen) {this.isOpen = isOpen;}public void setName(String name) {this.name = name;}public void setValue(int value) {this.value = value;}public boolean equals(Object o) {// 省略}protected boolean canEqual(Object other) {return other instanceof Config;}public int hashCode() {// 省略}public String toString() {return "Config(isOpen=" + this.isOpen() + ", name=" + this.getName() + ", value=" + this.getValue() + ")";}public static class ConfigBuilder {private boolean isOpen;private String name;private int value;ConfigBuilder() {}public ConfigBuilder isOpen(boolean isOpen) {this.isOpen = isOpen;return this;}public ConfigBuilder name(String name) {this.name = name;return this;}public ConfigBuilder value(int value) {this.value = value;return this;}public Config build() {return new Config(this.isOpen, this.name, this.value);}public String toString() {return "Config.ConfigBuilder(isOpen=" + this.isOpen + ", name=" + this.name + ", value=" + this.value + ")";}}
}

可以看到,ConfigBuilder中isOpen和value属性并没有使用我们想要设置的默认值。调用build方法时, ConfigBuilder会调用全参的构造方法来构造Config 对象。

解决方法

使用@Builder.Default注解来标识带默认值的属性

import lombok.Builder;
import lombok.Data;@Data
@Builder
public class SomeConfig {@Builder.Defaultprivate boolean isOpen = true;private String name;@Builder.Defaultprivate int value = 20;
}

修改后输出结果如下

Config(isOpen=true, name=test, value=20)

为什么加了@Builder.Default注解就能解决问题呢,看一下编译后的class文件就明白了

public class Config {private boolean isOpen;private String name;private int value;private static boolean $default$isOpen() {return true;}private static int $default$value() {return 20;}Config(boolean isOpen, String name, int value) {this.isOpen = isOpen;this.name = name;this.value = value;}public static ConfigBuilder builder() {return new ConfigBuilder();}public boolean isOpen() {return this.isOpen;}public String getName() {return this.name;}public int getValue() {return this.value;}public void setOpen(boolean isOpen) {this.isOpen = isOpen;}public void setName(String name) {this.name = name;}public void setValue(int value) {this.value = value;}public boolean equals(Object o) {// 省略}protected boolean canEqual(Object other) {return other instanceof Config;}public int hashCode() {// 省略}public String toString() {boolean var10000 = this.isOpen();return "Config(isOpen=" + var10000 + ", name=" + this.getName() + ", value=" + this.getValue() + ")";}public static class ConfigBuilder {private boolean isOpen$set;private boolean isOpen$value;private String name;private boolean value$set;private int value$value;ConfigBuilder() {}public ConfigBuilder isOpen(boolean isOpen) {this.isOpen$value = isOpen;this.isOpen$set = true;return this;}public ConfigBuilder name(String name) {this.name = name;return this;}public ConfigBuilder value(int value) {this.value$value = value;this.value$set = true;return this;}public Config build() {boolean isOpen$value = this.isOpen$value;if (!this.isOpen$set) {isOpen$value = Config.$default$isOpen();}int value$value = this.value$value;if (!this.value$set) {value$value = Config.$default$value();}return new Config(isOpen$value, this.name, value$value);}public String toString() {return "Config.ConfigBuilder(isOpen$value=" + this.isOpen$value + ", name=" + this.name + ", value$value=" + this.value$value + ")";}}
}

每个设置默认值的属性都会在Builder中加上是否设置的标记,如果没有主动设置值,则调用Config中的默认值的静态方法进行赋值,然后再调用Config全参构造方法构造该对象。

使用@Builder注解的缺点

  1. 如果在类上使用了@Builder 注解,那么你需要手动添加一个无参构造函数,否则有些序列化框架需要通过newInstance构造对象时会报错。
  2. 如果在类上使用了@Builder注解,就不能再在构造函数或方法上使用 @Builder注解,否则会导致重复生成构造器类
  3. 如果在类上使用了@Builder 注解,想给某个属性设置一个默认值,还需要在属性上使用@Builder.Default 注解,否则默认值会被忽略。
  4. 如果想让子类继承父类的属性,那么你需要在子类的全参构造函数上使用 @Builder注解,并且在父类上使用@AllArgsConstructor注解,否则子类的构造器类不会包含父类的属性
http://www.yayakq.cn/news/671710/

相关文章:

  • 自己建网站怎么做影视资源制作网站设计的公司
  • soho的网站怎么做商务网站建设学期总结
  • 石家庄网站建设.神鹿网络怎么做软件程序
  • net做网站酒厂网站模板
  • 做网站笔记本网站开发后端
  • 空间网站打不开电商平台建设公司
  • 网站网络设计是怎么做的wordpress创建子主题
  • 虚拟主机 部署网站吗娄底市网站建设制作
  • 常州孟河镇建设工程交易网站wordpress漏洞利用工具
  • 网站建设特色濮阳网站关键词
  • 职高网站建设知识点绵阳网站关键词
  • 萍乡企业网站建设个人做房产网站
  • 上海网站建设高端网站建设哪个公司比较好
  • wordpress 一键建站网站开发制作入什么科目
  • 做网站的技术支持静态网站怎么维护
  • 产品设计公司网站四川省建十一公司官网
  • 郑州建设厅网站怎么可以自己做网站
  • 做推广的网站名称建筑工程公司需要哪些资质证书
  • 网站建设方案哪家好 推荐wordpress调用置顶文章
  • 网站进入百度沙盒网站源码爬取工具
  • 瑞安外贸网站制作网站建站 外贸
  • githup网站建设wordpress 企业网站 教程
  • 紫色 网站广州建网站腾虎
  • vs2017做的网站织梦做的网站很老
  • 宁夏建网站报价wap网站 区别
  • 西安企业建站网站做担保交易
  • 俄罗斯网络公司排名wordpress mysql 优化
  • 网站建设与管理职业分析高仿id97网站模板
  • 广州网站建设seo设计房子的软件app
  • 免费贴图素材网站广州网站改版 网站建设