記錄:395
場景:手動編寫Java類的Builder及其應(yīng)用。使用lombok的@Data和@Builder注解構(gòu)建Java類的Builder及其應(yīng)用。
Java Builder模式:是Java設(shè)計模式之一,它屬于對象創(chuàng)建型模式,是將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
結(jié)論一:使用lombok的@Data和@Builder注解構(gòu)建Java類的Builder簡潔高效,推薦實際應(yīng)用。
結(jié)論二:手動編寫Java類的Builder,能夠全貌理解Builder模式,推薦試試。
結(jié)論三:Java類的Builder模式,最大好處就是構(gòu)建對象時,可以靈活構(gòu)建需要的屬性。
7.1普通Java類
7.1.1普通Java對象
普通Java類,一般有屬性、set、get、toString方法。
7.1.2代碼
public class City01Response implements Serializable {
private boolean success;
private String msg;
private Long cityId;
private String cityName;
private String cityDescribe;
public City01Response() {
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Long getCityId() {
return cityId;
}
public void setCityId(Long cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getCityDescribe() {
return cityDescribe;
}
public void setCityDescribe(String cityDescribe) {
this.cityDescribe = cityDescribe;
}
@Override
public String toString() {
return "City01Response(" + "success=" + success + ", msg=" + msg + ", cityId=" + cityId + ", cityName=" + cityName + ", cityDescribe=" + cityDescribe + ")";
}
}
7.2普通Java類使用@Data注解
7.2.1普通Java類
使用@Data注解后,普通Java類,只有屬性。set、get、toString方法由@Data注解接管。使用方式等價。
7.2.2代碼
@Data
public class City01Response implements Serializable {
private boolean success;
private String msg;
private Long cityId;
private String cityName;
private String cityDescribe;
}
7.3手動編寫Java類的Builder(靜態(tài)內(nèi)部類)
7.3.1手動編寫Java類的Builder
本例內(nèi)部類使用靜態(tài)類實現(xiàn),build使用靜態(tài)方法。
普通Java類:City02Response
(1)編寫普通Java類:City02Response,一般有屬性、set、get、toString方法。
(2)在普通Java類:City02Response中,編寫一個內(nèi)部類:City02ResponseBuilder。
(3)在普通Java類:City02Response中,實現(xiàn)一個builder方法,創(chuàng)建一個內(nèi)部類City02ResponseBuilder的對象。
(4)在內(nèi)部類:City02ResponseBuilder中,實現(xiàn)一個build方法,返回普通Java類:City02Response的對象。
(5)在內(nèi)部類:City02ResponseBuilder中。為每個屬性實現(xiàn)一個設(shè)置方法,并且返回City02ResponseBuilder對象本身,即返回this。
7.3.2代碼
public class City02Response implements Serializable {
private boolean success;
private String msg;
private Long cityId;
private String cityName;
private String cityDescribe;
public static City02Response.City02ResponseBuilder builder() {
return new City02Response.City02ResponseBuilder();
}
public static City02Response getCityInfoSuccess(Long cityID, String cityName, String cityDescribe) {
return builder().success(true).msg("獲取城市信息成功").cityId(cityID).cityName(cityName).cityDescribe(cityDescribe).build();
}
public static City02Response getCityInfoFail(Long cityID, String failMsg) {
return builder().success(false).msg(failMsg).cityId(cityID).build();
}
public City02Response() {
}
public City02Response(boolean success, String msg, Long cityId, String cityName, String cityDescribe) {
this.success = success;
this.msg = msg;
this.cityId = cityId;
this.cityName = cityName;
this.cityDescribe = cityDescribe;
}
@Override
public String toString() {
return "City02Response(" + "success=" + success + ", msg=" + msg + ", cityId=" + cityId + ", cityName=" + cityName + ", cityDescribe=" + cityDescribe + ")";
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Long getCityId() {
return cityId;
}
public void setCityId(Long cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getCityDescribe() {
return cityDescribe;
}
public void setCityDescribe(String cityDescribe) {
this.cityDescribe = cityDescribe;
}
public static class City02ResponseBuilder {
private boolean success;
private String msg;
private Long cityId;
private String cityName;
private String cityDescribe;
City02ResponseBuilder() {
}
public City02Response build() {
return new City02Response(success, msg, cityId, cityName, cityDescribe);
}
public City02Response.City02ResponseBuilder success(final boolean success) {
this.success = success;
return this;
}
public City02Response.City02ResponseBuilder msg(final String msg) {
this.msg = msg;
return this;
}
public City02Response.City02ResponseBuilder cityId(final Long cityId) {
this.cityId = cityId;
return this;
}
public City02Response.City02ResponseBuilder cityName(final String cityName) {
this.cityName = cityName;
return this;
}
public City02Response.City02ResponseBuilder cityDescribe(final String cityDescribe) {
this.cityDescribe = cityDescribe;
return this;
}
@Override
public String toString() {
return "City02ResponseBuilder.City02Response(" + "success=" + success + ", msg=" + msg + ", cityId=" + cityId + ", cityName=" + cityName + ", cityDescribe=" + cityDescribe + ")";
}
}
}
7.3.3代碼中的getCityInfoSuccess和getCityInfoFail是對builder封裝使用
代碼中的getCityInfoSuccess和getCityInfoFail是對builder封裝應(yīng)用。不是必須部分。
7.4使用lombok的@Data和@Builder注解構(gòu)建Java對象的Builder
7.4.1使用@Data和@Builder注解
使用@Data和@Builder注解,簡化代碼,效果等價。需引入jar包。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
7.4.2代碼
@Data
@Builder
public class City03Response implements Serializable {
private boolean success;
private String msg;
private Long cityId;
private String cityName;
private String cityDescribe;
public static City03Response getCityInfoSuccess(Long cityID, String cityName, String cityDescribe) {
return builder().success(true).msg("獲取城市信息成功").cityId(cityID).cityName(cityName).cityDescribe(cityDescribe).build();
}
public static City03Response getCityInfoFail(Long cityID, String failMsg) {
return builder().success(false).msg(failMsg).cityId(cityID).build();
}
}
7.4.3代碼中的getCityInfoSuccess和getCityInfoFail是對builder封裝使用
代碼中的getCityInfoSuccess和getCityInfoFail是對builder封裝應(yīng)用。不是必須部分。
7.5普通Jave類和Builder類分開
7.5.1普通Java類
public class City04Response {
private boolean success;
private String msg;
private Long cityId;
private String cityName;
private String cityDescribe;
public City04Response(boolean success, String msg, Long cityId, String cityName, String cityDescribe) {
this.success = success;
this.msg = msg;
this.cityId = cityId;
this.cityName = cityName;
this.cityDescribe = cityDescribe;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Long getCityId() {
return cityId;
}
public void setCityId(Long cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getCityDescribe() {
return cityDescribe;
}
public void setCityDescribe(String cityDescribe) {
this.cityDescribe = cityDescribe;
}
@Override
public String toString() {
return "City04Response(" + "success=" + success + ", msg=" + msg + ", cityId=" + cityId + ", cityName=" + cityName + ", cityDescribe=" + cityDescribe + ")";
}
}
7.5.2普通Java類的Builder類
public class City04ResponseBuilder implements Serializable {
private boolean success;
private String msg;
private Long cityId;
private String cityName;
private String cityDescribe;
public City04ResponseBuilder setSuccess(boolean success) {
this.success = success;
return this;
}
public City04ResponseBuilder setMsg(String msg) {
this.msg = msg;
return this;
}
public City04ResponseBuilder setCityId(Long cityId) {
this.cityId = cityId;
return this;
}
public City04ResponseBuilder setCityName(String cityName) {
this.cityName = cityName;
return this;
}
public City04ResponseBuilder setCityDescribe(String cityDescribe) {
this.cityDescribe = cityDescribe;
return this;
}
public City04Response build() {
return new City04Response(success, msg, cityId, cityName, cityDescribe);
}
}
7.6應(yīng)用
7.6.1測試
public class UseBuildUtils {
public static void main(String[] args) {
City02Response city02Response;
System.out.println("原生的Builder的Java對象,City02Response的Builder使用:");
city02Response = City02Response.builder().success(true).msg("獲取城市信息成功").cityId(20230328L).cityName("杭州").cityDescribe("杭州是一個互聯(lián)網(wǎng)城市").build();
System.out.println("City02Response直接使用builder: " +city02Response.toString());
city02Response = City02Response.getCityInfoSuccess(20230328L, "杭州", "杭州是一個互聯(lián)網(wǎng)城市");
System.out.println("City02Response獲取成功: " +city02Response.toString());
city02Response = City02Response.getCityInfoFail(20230328L, "網(wǎng)絡(luò)異常,無法獲取信息");
System.out.println("City02Response獲取失敗: " +city02Response.toString());
City03Response city03Response;
System.out.println("基于注解@Data和@Builder的Java對象,city03Response的Builder使用:");
city03Response = City03Response.builder().success(true).msg("獲取城市信息成功").cityId(20230328L).cityName("蘇州").cityDescribe("工業(yè)城市").build();
System.out.println("city03Response直接使用builder: " +city03Response.toString());
city03Response = City03Response.getCityInfoSuccess(20230328L, "蘇州", "工業(yè)城市");
System.out.println("city03Response獲取成功: " +city03Response.toString());
city03Response = City03Response.getCityInfoFail(20230328L, "網(wǎng)絡(luò)異常,無法獲取信息");
System.out.println("city03Response獲取失敗: " +city03Response.toString());
System.out.println("普通Java類和Builder類分開場景的Builder使用:");
City04Response city04Response = new City04ResponseBuilder().setSuccess(true).setMsg("獲取城市信息成功").setCityId(20230328L).setCityName("寧波").setCityDescribe("港口城市").build();
System.out.println("city04Response獲取成功:"+city04Response.toString());
}
}
7.6.2打印
原生的Builder的Java對象,City02Response的Builder使用:
City02Response直接使用builder: City02Response(success=true, msg=獲取城市信息成功, cityId=20230328, cityName=杭州, cityDescribe=杭州是一個互聯(lián)網(wǎng)城市)
City02Response獲取成功: City02Response(success=true, msg=獲取城市信息成功, cityId=20230328, cityName=杭州, cityDescribe=杭州是一個互聯(lián)網(wǎng)城市)
City02Response獲取失敗: City02Response(success=false, msg=網(wǎng)絡(luò)異常,無法獲取信息, cityId=20230328, cityName=null, cityDescribe=null)
基于注解@Data和@Builder的Java對象,city03Response的Builder使用:
city03Response直接使用builder: City03Response(success=true, msg=獲取城市信息成功, cityId=20230328, cityName=蘇州, cityDescribe=工業(yè)城市)
city03Response獲取成功: City03Response(success=true, msg=獲取城市信息成功, cityId=20230328, cityName=蘇州, cityDescribe=工業(yè)城市)
city03Response獲取失敗: City03Response(success=false, msg=網(wǎng)絡(luò)異常,無法獲取信息, cityId=20230328, cityName=null, cityDescribe=null)
普通Java類和Builder類分開場景的Builder使用:
city04Response獲取成功:City04Response(success=true, msg=獲取城市信息成功, cityId=20230328, cityName=寧波, cityDescribe=港口城市)
以上,感謝。文章來源:http://www.zghlxwxcb.cn/news/detail-494292.html
2023年3月29日文章來源地址http://www.zghlxwxcb.cn/news/detail-494292.html
到了這里,關(guān)于Java類的Builder應(yīng)用以及使用@Data和@Builder高效應(yīng)用Builder的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!