欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java的Builder原理和實(shí)現(xiàn)詳解

 更新時(shí)間:2021年12月29日 10:32:08   作者:I_belong_to_jesus  
大家好,本篇文章主要講的是java的Builder原理和實(shí)現(xiàn)詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

首先給一個(gè)簡單的Builder設(shè)計(jì)模式的例子:

主實(shí)現(xiàn)類代碼如下:

/**
 * 實(shí)體類 包含一個(gè)靜態(tài)內(nèi)部類 Builder
 */
public class CompanyClient {
    public String companyName;
    // 用final修飾的成員變量表示常量,只能被賦值一次,賦值后值無法改變! final修飾的變量有三種:靜態(tài)變量、實(shí)例變量和局部變量。
    public String companyAddress;
  
    public double companyRegfunds;
    public String mPerson;
    public String mType;     
     //構(gòu)造方法 
     public CompanyClient() {
         this(new Builder());
     }
     //構(gòu)造方法
     public CompanyClient(Builder builder){
         this.companyName = builder.companyName;
         this.companyAddress = builder.companyAddress;
         this.companyRegfunds = builder.companyRegfunds;
         this.mPerson = builder.person;
         this.mType = builder.type;
     }
     public String getCompanyName() {
         return companyName;
     }
  
     public String getCompanyAddress() {
         return companyAddress;
     }
  
     public double getCompanyRegfunds() {
         return companyRegfunds;
     }
  
     public String getmPerson() {
         return mPerson;
     }
  
     public String getmType() {
         return mType;
     }
         
     public Builder newBuilder() {
         return new Builder(this);
     }
  
     @Override //重寫toString方法后,當(dāng)print這個(gè)對象的時(shí)候,會默認(rèn)的調(diào)用toString()這個(gè)方法。
     public String toString() {
         return "CompanyClient{" +
                 "companyName='" + companyName + '\'' +
                 ", companyAddress='" + companyAddress + '\'' +
                 ", companyRegfunds=" + companyRegfunds +"千萬"+
                 ", mPerson=" + mPerson +
                 ", mType='" + mType + '\'' +
                 '}';
     }
     /**
     *靜態(tài)內(nèi)部類 Builder
     */
     public static class Builder{
        public String companyName;
        public String companyAddress;
        public  double companyRegfunds;
        public  String person;
        public String type;
        //構(gòu)造方法
        public Builder() {
            companyName = companyName;
            companyAddress = companyAddress;
            companyRegfunds = companyRegfunds;
            person = person;
            type = type;
  
        }
        //構(gòu)造方法
        Builder(CompanyClient companyClient){
            this.companyName = companyClient.companyName;
            this.companyAddress = companyClient.companyAddress;
            this.companyRegfunds = companyClient.companyRegfunds;
            this.person = companyClient.mPerson;
            this.type = companyClient.mType;
        }
  
        public Builder setCompanyName(String name) {
            companyName = name;
            return this;
        }
  
        public Builder setCompanyAddress(String address) {
            companyAddress = address;
            return this;
        }
  
        public Builder setCompanyRegfunds(double regfunds) {
            companyRegfunds = regfunds;
            return this;
        }
  
        public Builder setmPerson(String per) {
            person = per;
            return this;
        }
  
        public Builder setmType(String typeStr) {
            type = typeStr;
            return this;
        }
         //構(gòu)建一個(gè)實(shí)體
         public CompanyClient build() {
             return new CompanyClient(this);
         }
    }
 }

測試類實(shí)現(xiàn)代碼如下:

public class TestBuilder {
    public static void main(String[] args) {
 
        CompanyClient client = new CompanyClient.Builder()
                .setCompanyName("alibaba")
                .setCompanyAddress("wangjing")
                .setCompanyRegfunds(5)
                .setmPerson("10000")
                .build();
        System.out.println(client);
        System.out.println("---------------------");
        CompanyClient.Builder builder = new CompanyClient.Builder();
        builder.setCompanyName("huawei");
        builder.setCompanyAddress("haidian");
        builder.setCompanyRegfunds(20);
        builder.setmType("communication");
        CompanyClient client1 = builder.build();
        System.out.println(client1);
        System.out.println("---------------------");
        CompanyClient.Builder build1 = client1.newBuilder();
        build1.setCompanyName("baidu");
        CompanyClient client2 = build1.build();
        System.out.println(client2);
    }
}

輸出結(jié)果如下:

CompanyClient{companyName='alibaba', companyAddress='wangjing', companyRegfunds=5.0千萬, mPerson=10000, mType='null'}
---------------------
CompanyClient{companyName='huawei', companyAddress='haidian', companyRegfunds=20.0千萬, mPerson=null, mType='communication'}
---------------------
CompanyClient{companyName='baidu', companyAddress='haidian', companyRegfunds=20.0千萬, mPerson=null, mType='communication'}

首先看main函數(shù)中的第一行代碼:

CompanyClient client = new CompanyClient.Builder()
                .setCompanyName("alibaba")
                .setCompanyAddress("wangjing")
                .setCompanyRegfunds(5)
                .setmPerson("10000")
                .build();

之所以可以這么執(zhí)行,是因?yàn)?strong>內(nèi)部靜態(tài)類Builder里定義了一份與CompanyClient類一模一樣的變量,通過一系列的成員函數(shù)進(jìn)行設(shè)置屬性值,但是返回值都是this,也就是都是Builder對象,最后提供了一個(gè)build函數(shù)用于創(chuàng)建CompanyClient對象,返回的是CompanyClient對象,對應(yīng)的構(gòu)造函數(shù)在CompanyClient?類中進(jìn)行定義,也就是構(gòu)造函數(shù)的入?yún)⑹?strong>Builder對象,然后依次對自己的成員變量進(jìn)行賦值,對應(yīng)的值都是Builder對象中的值。此外Builder類中的成員函數(shù)返回Builder對象自身的另一個(gè)作用就是讓它支持鏈?zhǔn)秸{(diào)用,使代碼可讀性大大增強(qiáng)。

總結(jié)下,Java環(huán)境下builder設(shè)計(jì)模式:

定義一個(gè)靜態(tài)內(nèi)部類Builder,內(nèi)部的成員變量和外部類一樣

Builder類通過一系列的方法用于成員變量的賦值,并返回當(dāng)前對象本身(this)

Builder類提供一個(gè)build方法或者create方法用于創(chuàng)建對應(yīng)的外部類,該方法內(nèi)部調(diào)用了外部類的一個(gè)私有構(gòu)造函數(shù),該構(gòu)造函數(shù)的參數(shù)就是內(nèi)部類Builder

外部類提供一個(gè)私有構(gòu)造函數(shù)供內(nèi)部類調(diào)用,在該構(gòu)造函數(shù)中完成成員變量的賦值,取值為Builder對象中對應(yīng)的值

到此這篇關(guān)于java的Builder原理和實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)java Builder原理和實(shí)現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中單例和多例的深入理解

    Spring中單例和多例的深入理解

    這篇文章主要介紹了Spring中單例和多例的深入理解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java 高并發(fā)四:無鎖詳細(xì)介紹

    Java 高并發(fā)四:無鎖詳細(xì)介紹

    本文主要介紹Java 高并發(fā)無鎖的知識,這里整理了 1.無鎖類的原理詳解 2.無鎖類的使用的知識,并講解其原理,有需要的小伙伴可以參考下
    2016-09-09
  • Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼

    Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼

    這篇文章主要介紹了Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Feign超時(shí) 在yml文件里的配置方式

    Feign超時(shí) 在yml文件里的配置方式

    這篇文章主要介紹了Feign超時(shí) 在yml文件里的配置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • spring boot2.0總結(jié)介紹

    spring boot2.0總結(jié)介紹

    今天小編就為大家分享一篇關(guān)于spring boot2.0總結(jié)介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Spring Boot2.X中findOne的使用詳解

    Spring Boot2.X中findOne的使用詳解

    這篇文章主要介紹了Spring Boot2.X中findOne的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 深入了解Java atomic原子類的使用方法和原理

    深入了解Java atomic原子類的使用方法和原理

    這篇文章主要介紹了深入了解Java atomic原子類的使用方法和原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • Spring Boot 集成 ElasticSearch應(yīng)用小結(jié)

    Spring Boot 集成 ElasticSearch應(yīng)用小結(jié)

    這篇文章主要介紹了Spring Boot 集成 ElasticSearch應(yīng)用小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Java中多個(gè)線程交替循環(huán)執(zhí)行的實(shí)現(xiàn)

    Java中多個(gè)線程交替循環(huán)執(zhí)行的實(shí)現(xiàn)

    有些時(shí)候面試官經(jīng)常會問,兩個(gè)線程怎么交替執(zhí)行呀,本文就來詳細(xì)的介紹一下Java中多個(gè)線程交替循環(huán)執(zhí)行的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Java編程用指定字符打印菱形實(shí)例

    Java編程用指定字符打印菱形實(shí)例

    本文主要介紹了用指定的字符打印菱形的方法實(shí)例,一個(gè)簡單容日上手的小程序,喜歡的朋友可以拿來練習(xí)一下。
    2017-09-09

最新評論