什么是预设参数?
允许函式在没有传入值的情况下,以指定的预设值初始化。
直观方法
建构子多载public class Person{ private String name; private int age; private int gender; public Person(String name, int age, int gender){ this.name = name; this.age = age; this.gender = gender; } public Person(int age, int gender){ this.name = "noName"; // 预设参数 this.age = age; this.gender = gender }}
困境-当参数型态相同时无法分辨省略了哪个参数, 如範例中的age和 gender当参数很多的时候,要写很多多型的建构子简易的 Builder Pattern 概念
透过介面定义一个创建的过程,将物件的建构过程隐藏
* 使用情境: 当传入的物件较为複杂时, 分离创建步骤, 使创建过程更清晰 (请自行搜寻, 本篇不讨论)
public class Person{ ... public Person(String name, int age, int gender){ ... }} public interface Builder{ //以介面分离 void setName(String name); void setAge(int age); void setGender(int gender); void Person create();}public class concreteBuilder implements Builder{ // 实作介面方法}
使用Builder Pattern 完成物件初始化
public class Person{ ... private Person(String name, int age, int gender){ // 将建构子存取权限设为私有, 让使用者无法直接创建 ... } public static class Builder{ // 透过静态Builder 物件创建物件 private String name; private int age; private int gender; public Builder(){ // 不需参数即可创建 (使用预设值) this.name = "Diane"; this.age = 18; this.gender = 2; } public Builder setName(String name){ // 开放方法让使用者可以选择性输入 this.name = name; return this; } .... public Person creat(){ // 必须透过Builder呼叫才可以创建物件 retrun new Person(name,age,int); } }}
public class Main { public static void main(String[] args){ Person person = new Person.Builder().setName("Tina").create(); Person person2 = new Person.Builder().create(); System.out.println(person.getName()); //Tina System.out.println(person2.getName()); //Diane }}