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

廊坊网站制作费用wordpress自定义分类模板下载

廊坊网站制作费用,wordpress自定义分类模板下载,自己做ppt网站,神州行套餐曾经#xff0c;我在《千万不要再随便使用 lombok 的 Builder 了#xff01;》 一文中提到 Builder 注解的其中一个大坑会导致默认值失效#xff01; 最近阅读了 《Oh !! Stop using Builder》 发现 Builder 的问题还不止一个#xff0c;Builder 会让人误以为是遵循构建器… 曾经我在《千万不要再随便使用 lombok 的 Builder 了》 一文中提到 Builder 注解的其中一个大坑会导致默认值失效 最近阅读了 《Oh !! Stop using Builder》 发现 Builder 的问题还不止一个Builder 会让人误以为是遵循构建器模式实则不然后面会介绍。 总的来说不推荐再使用 Builder 注解接下来讲重点介绍其原因和替代方案。 二、场景复现 2.1 如果不使用 Builder 类定义 package io.gitrebase.demo;import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class APIResponseT {private T payload;private Status status;}使用示例 package io.gitrebase.demo;import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice;Slf4j RestControllerAdvice(assignableTypes  io.gitrebase.demo.RestApplication.class) public class ApplicationExceptionHandler {ResponseStatus(code  HttpStatus.INTERNAL_SERVER_ERROR)public APIResponse handleException(Exception exception) {log.error(Unhandled Exception, exception);Status status  new Status();status.setResponseCode(RESPONSE_CODE_IDENTIFIER);status.setDescription(Bla Bla Bla);APIResponse response  new APIResponse();response.setStatus(status);return response;}}2.2 使用 Builder 类定义 package io.gitrebase.demo;import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;Builder Data NoArgsConstructor AllArgsConstructor public class APIResponseT {private T payload;private Status status;}使用示例 package io.gitrebase.demo;import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice;Slf4j RestControllerAdvice(basePackageClasses  io.gitrebase.demo.RestApplication.class) public class ApplicationExceptionHandler {ResponseStatus(code  HttpStatus.INTERNAL_SERVER_ERROR)public APIResponse handleException(Exception exception) {log.error(Unhandled Exception, exception);return APIResponse.builder().status(Status.builder().responseCode(RESPONSE_CODE_IDENTIFIER).description(Bla Bla Bla).build()).build();}}三、为什么不推荐使用 Builder? Builder 会生成一个不完美的构建器它不能区分哪些参数是必须的哪些是可选的。这可能会导致构建对象时出现错误或不一致的情况。 很多人习惯于将 Builder 和 Data 一起使用使用会生成一个可变的构建器它有 setter 方法可以修改构建器的状态。这违反了构建器模式的原则即构建器应该是不可变的一旦创建就不能修改。 Builder 会生成一个具体类型的构建器它不能适应不同类型的参数。这限制了构建器模式的优势即可以根据不同的抽象类型创建不同风格的对象。 Builder 的使用场景很有限它只适合那些有很多参数且大部分是可选的对象。对于那些只想实现一个流式风格的对象创建Builder 并不是一个好的选择。 四、替代方案 4.1 首推Accessor 类的定义 package io.gitrebase.demo;import lombok.Data; import lombok.experimental.Accessors;Data Accessors(chain  true) public class APIResponseT {private T payload;private Status status;}编译后的类 package io.gitrebase.demo;import lombok.experimental.Accessors;Accessors(chain  true) public class APIResponseT {private T payload;private Status status;public T getPayload() {return this.payload;}public APIResponseT setPayload(T payload) {this.payload  payload;return this;}public Status getStatus() {return this.status;}public APIResponseT setStatus(Status status) {this.status  status;return this;} }使用示例 package io.gitrebase.demo;import lombok.extern.slf4j.Slf4j; import lombok.var; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice;Slf4j RestControllerAdvice(basePackageClasses  io.gitrebase.demo.RestApplication.class) public class ApplicationExceptionHandler {ResponseStatus(code  HttpStatus.INTERNAL_SERVER_ERROR)public APIResponse handleException(Exception exception) {log.error(Unhandled Exception, exception);var status  new Status().setResponseCode(RESPONSE_CODE_IDENTIFIER).setDescription(Bla Bla Bla);return new APIResponse().setStatus(status);}}此外该注解还支持一些高级方法 /*** A container for settings for the generation of getters and setters.* p* Complete documentation is found at a hrefhttps://projectlombok.org/features/experimental/Accessorsthe project lombok features page for #64;Accessors/a.* p* Using this annotation does nothing by itself; an annotation that makes lombok generate getters and setters,* such as {link lombok.Setter} or {link lombok.Data} is also required.*/ Target({ElementType.TYPE, ElementType.FIELD}) Retention(RetentionPolicy.SOURCE) public interface Accessors {/*** If true, accessors will be named after the field and not include a {code get} or {code set}* prefix. If true and {code chain} is omitted, {code chain} defaults to {code true}.* strongdefault: false/strong* * return Whether or not to make fluent methods (named {code fieldName()}, not for example {code setFieldName}).*/boolean fluent() default false;/*** If true, setters return {code this} instead of {code void}.* strongdefault: false/strong, unless {code fluenttrue}, then strongdefault: true/strong* * return Whether or not setters should return themselves (chaining) or {code void} (no chaining).*/boolean chain() default false;/*** If present, only fields with any of the stated prefixes are given the getter/setter treatment.* Note that a prefix only counts if the next character is NOT a lowercase character or the last* letter of the prefix is not a letter (for instance an underscore). If multiple fields* all turn into the same name when the prefix is stripped, an error will be generated.* * return If you are in the habit of prefixing your fields (for example, you name them {code fFieldName}, specify such prefixes here).*/String[] prefix() default {}; }另外如果一个类有些参数必传有些参数选传可以将必传参数定义到构造方法上非必传参数采用 Accessor 方式链式设置。 // 导入 lombok 注解 import lombok.Data; import lombok.experimental.Accessors;// 定义 Person 类 Getter // 自动生成 getter 方法 Accessors(chain  true) // 开启链式调用 public class Person {// 定义必传的属性private String name; // 姓名private int id; // 编号// 定义选填的属性private int age; // 年龄private String address; // 地址// 定义构造函数接收必传的参数public Person(String name, int id) {this.name  name;this.id  id;} }// 使用示例 public class Main {public static void main(String[] args) {// 创建一个 Person 对象传入必要的参数,通过链式调用设置选填的属性Person person  new Person(张三, 1001).setAge(25).setAddress(北京市);// 打印 Person 对象的信息System.out.println(person);} }4.2 手动模拟 Accessor 由于 Accessor 在 lombok.experimental包下有极个非常谨慎的人会担心未来不稳定未来可能被移除。 其实在我看来这个担心有些多余目前这个注解比 Builder 更适合使用而且一个成熟的工具类库不会轻易移除一个功能而且及时移除了这个功能编译期就可以感知到替换起来也很容易。 如果真的担心不稳定或者不想依赖 lombok那么自己在默认生成的 Setter 方法上改造一下即可。 五、启发 大多数同学使用 lombok 注解都不会主动看源码了解有哪些高级配置。建议工作之余稍微花点时间去看一下源码。 大家在使用 lombok 注解时一定要在脑海中能够准确“编译” 出背后的代码。如果你没有这个能力早晚会遇到坑。如果你没有这个能力那么多去看编译后的类熟能生巧。 并不是大家都在用的都是对的使用某些功能时需要主动思考是否正确哪怕是正确的是否是最佳的。Builder 注解的确和构建器设计模式有些背离很多时候我们需要的是Accessor 的行为。 最后说一句(求关注!别白嫖) 如果这篇文章对您有所帮助或者有所启发的话求一键三连点赞、转发、在看。 关注公众号woniuxgg在公众号中回复笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记回复面试、开发手册、有超赞的粉丝福利
http://www.zqtcl.cn/news/459084/

相关文章:

  • 网站关键词进前三响应式手机网站模版
  • 网站采集来源制作好网站
  • 哪个网站有工笔教程免费物流公司网站模板
  • 网站怎么做才有收录西安建设工程信息网人员查询
  • 用dedecms做的网站电子商务公司名称大全简单大气
  • 网站建设的业务员wordpress font awesome
  • 艺术公司网站定制中心怎么搜索网站搜索量
  • 陕西网站建设设计公司西部数码网站管理助手破解版
  • 网站建设框架构建正规的app网站开发
  • 离退休工作网站建设方案wordpress在线浏览pdf
  • 昆明免费网站制作wordpress自定义路由
  • html5视频网站开发江西响应式网站制作
  • 网站照片加水印家装公司十大口碑排名
  • 做网站还有用PHP网站开发如何建立vip
  • 东莞广告公司东莞网站建设辽宁城乡建设部网站
  • 公司网站开发详细流程php网站开发优点
  • 广东网站建设多少钱比较大气的网站
  • asp.net怎么做登录网站网站建设服务网络服务
  • 网站备案级别做公司网站要多少钱
  • 湛江网站seo网站定制排名
  • 为什么网站之有首页被收录企业网站发布图片文章
  • 做网站要准备内蒙做网站
  • 邯郸市搞网站服务务的吗网站建设怎么在图片上加字
  • 卡片风格网站我想做跑腿网站怎么做
  • 公司网站建设前期情况说明如何找厂家地址
  • 超值的郑州网站建设wordpress 移除 新闻
  • 长春网络营销网站徐州手机模板建站
  • 微网站开发+在线商城建设局招标网站
  • 网站开发的基本过程关岭做网站
  • 高端网站哪种好WordPress媒体库丢失