最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

/**
 * 實體類 包含一個靜態(tài)內(nèi)部類 Builder
 */
public class CompanyClient {
    public String companyName;
    // 用final修飾的成員變量表示常量,只能被賦值一次,賦值后值無法改變! final修飾的變量有三種:靜態(tài)變量、實例變量和局部變量。
    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這個對象的時候,會默認(rèn)的調(diào)用toString()這個方法。
     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)建一個實體
         public CompanyClient build() {
             return new CompanyClient(this);
         }
    }
 }

測試類實現(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í)行,是因為內(nèi)部靜態(tài)類Builder里定義了一份與CompanyClient類一模一樣的變量,通過一系列的成員函數(shù)進(jìn)行設(shè)置屬性值,但是返回值都是this,也就是都是Builder對象,最后提供了一個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對象自身的另一個作用就是讓它支持鏈?zhǔn)秸{(diào)用,使代碼可讀性大大增強(qiáng)。

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

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

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

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

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

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

相關(guān)文章

  • Java如何正確的使用wait-notify方法你知道嗎

    Java如何正確的使用wait-notify方法你知道嗎

    這篇文章主要為大家詳細(xì)介紹了Java如何正確的使用wait-notify方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • SpringBoot解決跨域的5種方式小結(jié)

    SpringBoot解決跨域的5種方式小結(jié)

    在項目開發(fā)中,時常會遇到跨域問題,本文主要介紹了五種解決跨域的方法,使用最多的是第三種,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • @RequestBody注解Ajax post json List集合數(shù)據(jù)請求400/415的處理

    @RequestBody注解Ajax post json List集合數(shù)據(jù)請求400/41

    這篇文章主要介紹了@RequestBody注解Ajax post json List集合數(shù)據(jù)請求400/415的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • java中生產(chǎn)者消費者問題和代碼案例

    java中生產(chǎn)者消費者問題和代碼案例

    大家好,本篇文章主要講的是java中生產(chǎn)者消費者問題和代碼案例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • springboot自動配置原理解析

    springboot自動配置原理解析

    這篇文章主要介紹了springboot自動配置原理解析,幫助大家更好的理解和學(xué)習(xí)使用springboot,感興趣的朋友可以了解下
    2021-04-04
  • Java多線程4種拒絕策略小結(jié)

    Java多線程4種拒絕策略小結(jié)

    當(dāng)線程池中的任務(wù)隊列已滿且無法再接受新的任務(wù)時,就需要采取拒絕策略來處理這種情況,本文主要介紹了Java多線程拒絕策略,包含了四種常見的拒絕策略,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • springboot常用語法庫的基本語法

    springboot常用語法庫的基本語法

    FreeMarker 是一款?模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁,電子郵件,配置文件,源代碼等)的通用工具,這篇文章主要介紹了springboot常用語法庫的基本語法,需要的朋友可以參考下
    2022-12-12
  • Spring Boot Logging Level設(shè)置為off時的Bug

    Spring Boot Logging Level設(shè)置為off時的Bug

    這篇文章主要介紹了Spring Boot Logging Level設(shè)置為off時的Bug,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Mybatis?Plus?逆向工程介紹

    Mybatis?Plus?逆向工程介紹

    這篇文章主要介紹了Mybatis?Plus?逆向工程,文章通過Mybatis?Plus?逆向工程相關(guān)資料及示例代碼詳細(xì)介紹,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考一下
    2022-01-01
  • IE8+SpringMVC文件上傳防止JSON下載

    IE8+SpringMVC文件上傳防止JSON下載

    這篇文章主要介紹了IE8+SpringMVC文件上傳防止JSON下載的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評論

宁海县| 天长市| 从江县| 万州区| 滨海县| 永年县| 共和县| 延庆县| 黄平县| 新龙县| 雅江县| 云梦县| 南溪县| 宾阳县| 葵青区| 玛纳斯县| 得荣县| 南和县| 宣化县| 石柱| 华阴市| 竹北市| 衡南县| 岐山县| 齐河县| 灵宝市| 宁武县| 噶尔县| 肇庆市| 响水县| 武义县| 吉木萨尔县| 中阳县| 沾化县| 诸暨市| 沿河| 垣曲县| 昌黎县| 怀远县| 道孚县| 陆河县|