java中的.builder()方法实现详解
文章目录
- 一。简介
- 二。场景模拟
- 三。java实现
- 四。使用lombok插件进行优化
一。简介
1.我们在构建对象的时候,如果对象属性比较多,我们可以
- 使用一个构造器;
- 一个空的构造器,然后使用setter方法进行设置。
使用这些方法时会有冗长的构造函数或者setter方法,有不同参数默认值的构造函数需要多次定义,因此我们可以使用builder来简化代码的简介性。
2.那么什么是Builder呢?
它其实是一种设计模式,叫做建造者模式,它的含义是将一个复杂的对象的构建与它的表示分离,同样的构建过程可以创建不同的表示:
二。场景模拟
假如有一结果api结果返回值的类Result,其在代码中频繁被使用:
public class Result<T> {private int code;private String message;private T data;public Result(int code, String message, T data) {this.code = code;this.message = message;this.data = data;}public Result() {}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}@Overridepublic String toString() {return "Result{" +"code=" + code +", message='" + message + '\'' +", data=" + data +'}';}
}
如果要使用它,一般的方法是:
public class Main {public static void main(String[] args) {//方法1,使用全量的构造函数Result<String> result1 = new Result<>(200, "success", "");//方法2,使用空的构造函数加setter函数赋值Result<String> result2 = new Result<>();result2.setCode(200);result2.setMessage("success");result2.setData("");}
}
这两种使用方法的弊端有:
(1)方法一:当只需要部分参数的时候需要再定义个构造函数(比如失败的情况只需要code和message,结果肯定是空,因此不需要data),且一旦参数较多,则构造函数冗长;
(2)方法二:setter冗长;
因此我们需要builder
来解决这个问题
三。java实现
Result增加Builder类:
public static final class Builder<T> {private int code;private String message;private T data;private Builder() {}public Builder code(int val) {code = val;return this;}public Builder message(String val) {message = val;return this;}public Builder data(T val) {data = val;return this;}public Result build() {return new Result(this);}}
使用:
Result<String> result3 = new Result.Builder<>().code(404).message("failure").build();
Result<String> result4 = Result.newBuilder().code(404).message("failure").build();
四。使用lombok插件进行优化
优化后:
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {private int code;private String message;private T data;
}
使用:
Result<String> result5 = Result.<String>builder().code(404).message("failure").build();
java中的.builder()方法实现详解相关推荐
- java中的invoke方法_详解Java中Method的Invoke方法
在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到M ...
- Java中lombok @Builder注解使用详解
简介 Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外,通过@Builder注解,lombo ...
- java中的getClass()方法的详解
getClass()返回运行时的类: 1.示例代码: package com.dbzhang.demo4;public class Person {int id;private String name ...
- Java中Lambda表达式使用及详解
Java中Lambda表达式使用及详解 前言 一.Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中.使 ...
- python find的使用方法_Python中的rfind()方法使用详解
Python中的rfind()方法使用详解 rfind()方法返回所在子str 被找到的最后一个索引,或者-1,如果没有这样的索引不存在,可选择限制搜索字符串string[beg:end]. 语法 以 ...
- Java中的异常和处理详解
Java中的异常和处理详解 参考文章: (1)Java中的异常和处理详解 (2)https://www.cnblogs.com/lulipro/p/7504267.html 备忘一下.
- python中sort函数字符串_python中的sort方法使用详解
< Python树莓派编程>--3.3 Python入门 本节书摘来自华章出版社<Python树莓派编程>一书中的第3章,第3.3节,作者:[美]沃尔弗拉姆·多纳特(Wolfr ...
- python的sort方法是哪种_python中的sort方法使用详解
Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可 ...
- java中static修饰函数_详解java中static关键词的作用
在java中,static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载 ...
最新文章
- 《数字逻辑设计与计算机组成》一3.3 加法器
- python画简单图片-Python绘制“高颜值”桑基图
- STM32 电机教程 7 - 步进电机开环速度控制
- LeetCode 26.删除排序数组中的重复项
- 铃木uy125最高时速_五菱宏光mini EV月销三万辆,铃木是否后悔退出中国?
- 信息学奥赛一本通(1409:判决素数个数)
- Debian、Ubuntu源码编译制作安装包(一)
- 远程桌面连接服务器,提示身份验证错误,要求的函数不受支持,但又找不到加密Oracle修正
- Ubuntu PIL 安装
- 常用化学消毒剂使用方法
- 【原创】SSAS-引用维度与多数据源、多数据源视图引发分区错误
- 自抗扰控制器七-二阶 LADRC-PLL 结构设计
- VirtualBox 安装增强功能
- WDS功能及中继与桥接模式的区别.
- 图像区块分割与采样YUV4:2:0
- 【Eslint + Prettier + Husky + Commitlint】前端项目代码规范的搭建
- 2288H v5服务器恢复IBMC默认密码方法与步骤
- Gitlab访问突然出现 403 forbidden解决方案
- Yura and Developers
- 纳豆红曲的功效与作用是什么?
热门文章
- 更改netbios计算机名,如何修改NetBios computer name,使得与计算机名稱统一
- 基于 Netbios 发现内网存活主机
- 2022年全球市场医用激光系统总体规模、主要生产商、主要地区、产品和应用细分研究报告
- java replaceall 问号_ReplaceAll 特殊字符处理
- 2018-8-10-使用-ahk-让普通键盘变为Dvorak键盘
- Java时间工具类,获取日、周、旬、月、季度、半年、年等时间周期
- Knife4j 2.0.8发布,史诗级微服务聚合文档中间件诞生
- STM32F4---PWM输出
- fusioncharts java_FusionCharts在Java中的基本使用
- GPUAnimation的Mesh动画烘焙到贴图,学习笔记