1. 程式人生 > >java構造器和構建器

java構造器和構建器

本文摘自:https://blog.csdn.net/wh2827991/article/details/79013115

在例項化一個類的過程中,通常會遇到多個引數的建構函式,但如果有些引數是非必需的呢?每次都要初始化那麼多引數麼?

public class Person {
    private int id;//身份證號
    private String name;//姓名
    private int age;//年齡
    private boolean sex;//性別
    private String desc;//個人描述
    public Person(int id, String name, int
age, boolean sex, String desc) { this.id = id; this.name = name; this.age = age; this.sex = sex; this.desc = desc; } }

或者像下面這樣,建立一個必選引數的構造器,在建立幾個可選引數的構造器?

    public Person(int id, String name) {//兩個引數的
        this.id = id;
        this.name = name;
    }
 
    
public Person(int id, String name, int age) {//三個引數的 this.id = id; this.name = name; this.age = age; } public Person(int id, String name, int age, boolean sex) {//四個引數的 this.id = id; this.name = name; this.age = age; this.sex = sex; }

或setter方法?

JavaBean模式自身有嚴重的缺點,因為構造過程被分到幾個呼叫中,在構造過程中Javabean可能處於不一致的狀態,類無法僅僅通過檢驗構造器引數的有效性來保證一致性。JavaBean模式阻止了把類做成不可變的可能,這就需要程式設計師付出額外的努力確保執行緒安全 ---摘自Effective Java

那麼我們該怎樣用構建器來實現類的例項化而又不受制於建構函式限制呢?

public class Person {
    private final int id;//身份證號
    private final String name;//姓名
    private int age;//年齡
    private boolean sex;//性別
    private String desc;//個人描述
    private Person(Builder builder){
        this.id=builder.id;
        this.name=builder.name;
        this.age=builder.age;
        this.sex=builder.sex;
        this.desc=builder.desc;
    }
    public static class Builder{
        private final int id;
        private final String name;
        private int age;
        private boolean sex;
        private String desc;
        public Builder(int id, String name) {
            this.id = id;
            this.name = name;
        }
        public Builder age(int age){
            //年齡合法性檢查
            if(age<0)throw new IllegalArgumentException();
            else this.age=age;
            return this;
        }
        public Builder sex(boolean sex){
            this.sex=sex;
            return this;
        }
        public Builder desc(String desc){
            this.desc=desc;
            return this;
        }
        public Person build(){
            return new Person(this);
        }
    }
 
    @Override
    public String toString() {
        return "id:"+this.id+" 姓名:"+this.name+" 年齡:"+this.age+" 性別:"+this.sex+" 描述:"+this.desc;
    }
}

我們在main函式中測試一下

    public static void main(String[] args) {
        Builder builder=new Person.Builder(123,"張三");
        Person person=builder.age(18).sex(false).desc("好好學習,天天向上").build();
        System.out.println(person.toString());
    }
 

用構建器建立的例項易於閱讀和編寫,較javaBean模式又更加安全,自然,自然,每種方法都會有其優點和弊端,選擇合適的使用場景,會讓程式碼更加健壯易讀。

在例項化一個類的過程中,通常會遇到多個引數的建構函式,但如果有些引數是非必需的呢?每次都要初始化那麼多引數麼?

  1.   public classPerson{
  2.   private int id;//身份證號
  3.   private String name;//姓名
  4.   private int age;//年齡
  5.   private boolean sex;//性別
  6.   private String desc;//個人描述
  7.   publicPerson(int id, String name, int age, boolean sex, String desc){
  8.   this.id = id;
  9.   this.name = name;
  10.   this.age = age;
  11.   this.sex = sex;
  12.   this.desc = desc;
  13.   }
  14.   }
  15.    

或者像下面這樣,建立一個必選引數的構造器,在建立幾個可選引數的構造器?

  1.   publicPerson(int id, String name){//兩個引數的
  2.   this.id = id;
  3.   this.name = name;
  4.   }
  5.    
  6.   publicPerson(int id, String name, int age){//三個引數的
  7.   this.id = id;
  8.   this.name = name;
  9.   this.age = age;
  10.   }
  11.    
  12.   publicPerson(int id, String name, int age, boolean sex){//四個引數的
  13.   this.id = id;
  14.   this.name = name;
  15.   this.age = age;
  16.   this.sex = sex;
  17.   }
  18.    

或setter方法?

JavaBean模式自身有嚴重的缺點,因為構造過程被分到幾個呼叫中,在構造過程中Javabean可能處於不一致的狀態,類無法僅僅通過檢驗構造器引數的有效性來保證一致性。JavaBean模式阻止了把類做成不可變的可能,這就需要程式設計師付出額外的努力確保執行緒安全 ---摘自Effective Java

那麼我們該怎樣用構建器來實現類的例項化而又不受制於建構函式限制呢?

  1.   public classPerson{
  2.   private final int id;//身份證號
  3.   private final String name;//姓名
  4.   private int age;//年齡
  5.   private boolean sex;//性別
  6.   private String desc;//個人描述
  7.   privatePerson(Builder builder){
  8.   this.id=builder.id;
  9.   this.name=builder.name;
  10.   this.age=builder.age;
  11. 相關推薦

    java構造構建

    本文摘自:https://blog.csdn.net/wh2827991/article/details/79013115 在例項化一個類的過程中,通常會遇到多個引數的建構函式,但如果有些引數是非必需的呢?每次都要初始化那麼多引數麼? public class Person { privat

    Java中過濾器攔截的區別

    區別 對象 pos ava 初始 反射機制 action 調用 反射 1.攔截器是基於java反射機制的,而過濾器是基於函數回調的。 2.過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。 3.攔截器只對action起作用,而過濾器幾乎可以對所有請求起作用

    java基本型別包裝類【轉】

    java是一種面嚮物件語言,java中的類把方法與資料連線在一起,並構成了自包含式的處理單元.但在java中不能定義基本型別(primitive type),為了能將基本型別視為物件來處理,並能連線相關的方法,java為每個基本型別都提供了包裝類,這樣,我們便可以把這些

    tp讀取寫入

    save att 讀取 name 寫入 fun ted protect 顯示 一、讀取器 控制器調用如下: //以ID的方式查詢數據$user=User::get(3);//查詢ID為3的單條數據echo $user->username;//以對象的方式顯示對應的字段

    第二天:Linux上的編輯服務

    linux一、gedit編輯器gedit是一個Linux環境下的文本編輯器,類似windows下的寫字板程序,在不需要特別復雜的編程環境下,作為基本的文本編輯器比較合適二、Sublime編輯器Sublime Test是一個代碼編輯器(Sublime Text 2是收費軟件,但可以無限期試用)Sublime T

    DRF的解析渲染

    解析器 解析器的作用就是服務端接收客戶端傳過來的資料,把資料解析成自己想要的資料型別的過程。 本質就是對請求體中的資料進行解析。 Django的解析器 我們請求進來請求體中的資料在request.body中,那也就證明,解析器會把解析好的資料放入request.body 我們在檢視中可以列印requ

    MyBatis學習——第四篇(攔截攔截分頁實現)

    MyBatis架構體圖 1:mybatis核心物件 從MyBatis程式碼實現的角度來看,MyBatis的主要的核心部件有以下幾個: SqlSession         &n

    【ROS】rospy 釋出訂閱(Publisher and Subscriber)

    rospy L1: Publisher and Subscriber 參考(http://wiki.ros.org/rospy_tutorials/Tutorials/WritingPublisherSubscriber) 1 準備開發環境 1.1 建立功能包beginner_tutor

    DRF的解析渲染 DRF的解析渲染

    DRF的解析器和渲染器   解析器 解析器的作用就是服務端接收客戶端傳過來的資料,把資料解析成自己想要的資料型別的過程。 本質就是對請求體中的資料進行解析。 Django的解析器 我們請求進來請求體中的資料在request.b

    生成器,迭代裝飾

    1.生成器 解析器在實時生成資料,資料不會駐留在記憶體中。因此,其執行效率很高! yield 是一個類似 return 的關鍵字,只是這個函式返回的是個生成器 當你呼叫這個函式的時候,函式內部的程式碼並不立即執行 ,這個函式只是返回一個生成器物件 當你使用for進行迭代的時候,函式中的程

    機器學習實踐(六)—sklearn之轉換估計

    一、sklearn轉換器 想一下之前做的特徵工程的步驟? 1 例項化 (例項化的是一個轉換器類(Transformer)) 2 呼叫fit_transform(對於文件建立分類詞頻矩陣,不能同時呼叫) 我們

    【DRF解析渲染

    文章目錄 解析器 Django中的解析器 DRF中的解析器 DRF中的渲染器 解析器 解析器的作用就是服務端接收客戶端傳過來的資料,把資料解析成自己想要的資料型別的過程.

    TP5模型修改讀取

    現在所有的專案都是會把時間存成時間戳格式,取出的時候還要轉換 這時候就可以應用到讀取器這個功能。 讀取器的命名規則是:駝峰 ,get+欄位名+Attr   例如:getBirthdayAttr; 比如我要獲取生日。那麼可以如下操作: <?php namespace

    netty自定義編碼解碼(粘包處理)

    這裡的實現方式是:將訊息分為兩部分,也就是訊息頭和訊息尾,訊息頭中寫入要傳送資料的總長度,通常是在訊息頭的第一個欄位使用int值來標識傳送資料的長度。 首先我們寫一個Encoder,我們繼承自Me

    ROS學習筆記16(編寫簡單的訊息釋出訂閱 (Python))

    1 編寫釋出者節點 “節點”是連線到ROS網路的可執行檔案ROS術語。在這裡,我們將建立一個持續廣播訊息的釋出者(“talker”)節點。 將目錄更改為您在早期教程中建立的的beginner_tutorials包,並建立一個包: $ roscd beginner_tut

    Java 構造方法構造方法的過載

    構造方法的名字必須和類名相同 構造方法無返回型別,不能用final static修飾 class Person//構造一個person類 { private String name; private int age;//類中有name和age兩個私有屬性 publi

    thinkphp5 模型獲取修改

    一、模型獲取器: 控制器程式碼: $article=new Article(); $res = $article->get(34); echo $res->see_num;   模型層程式碼:模型層方法命名 get+欄位名駝峰+Attr ()

    網狀迭代迴圈

    OpenMesh還提供所謂的迴圈器,其提供與列舉相同或另一種型別的另一項相鄰的項的方法。 通常,CenterItem_AuxiliaryInformation_TargetItem_Iter指定迴圈器,該迴圈器列舉給定中心項周圍的所有目標項。 迴圈器的構造器具有迴圈器(MeshType mesh,Targ

    DRF之頻率限制、分頁、解析渲染

    一、頻率限制 1、頻率限制是做什麼的 開放平臺的API介面呼叫需要限制其頻率,以節約伺服器資源和避免惡意的頻繁呼叫。   2、頻率元件原理 DRF中的頻率控制基本原理是基於訪問次數和時間的,當然我們可以通過自己定義的方法來實現。當我們請求進來,走到我們頻率元件的時候,DRF內部會有一個字典

    JAVA構造方法物件的建立

     一:構造方法和物件的建立 package chapter4.constructor; public class TestConstructor {     public static void main(String[] args) {