当存在做个参数时,但是有些是必选的,有些事不必选的情况下用重叠构造器、Builer模式比较好
重叠构造器
public student(String name, int age){ this(name,age,""); } public student(String name, int age,String address){ this(name,age,address,0); } public student(String name, int age,String address,int telphone){ this(name,age,address,telephone,""); } public student(String name, int age,String address,int telphone,String nickname){ this(name,age,address,telephone,nickname); }
这样的话当你创建 new Student("张三",22);这样其它值就为0或“”了。
Builder模式
public class BuilderModel { private final String name; private final int age; private final String number; private final String address; //private final String nickname; private final int tel; public static class Builder{ //必填参数 private final String name; private final int age; //可算参数 private String number; private String address; private int tel; //name 和age 为必填参数 public Builder(String name ,int age){ this.name = name; this.age = age; } //可选参数方法池 public Builder setNumber(String val){ this.number =val; return this; } public Builder setAddress(String val){ this.address = val ; return this; } public Builder setTel(int val){ this.tel = val; return this; } public BuilderModel buid(){ return new BuilderModel(this); } } private BuilderModel(Builder builder){ this.name = builder.name; this.age = builder.age; //this.nickname = b this.address = builder.address; this.number = builder.number; this.tel = builder.tel; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub BuilderModel model = new BuilderModel.Builder("zs",22).setAddress("北京朝阳区").setNumber("12345").setTel(110).buid(); System.out.println(model.name+model.age); //model.age = 2; final type should not be asigned again! } }
这样 对于每个参数都比较清晰明了,更加易读,有人可能会问为什么不用对象封装属性,因为用对象封装属性当作参数的时候,不能确定它的不变动性(即比如你打算第一个方法调用 Student 对象,下面又有一个方法调Student对象,但是当你在第一个方法里面如果对Student 对象做了修改的话,那样后面一个也就跟着修改了,因为是同一个引用)
例如
public class BuilderModel { /** * @param args */ public static void main(String[] args) { BuilderModel.Student stu = new BuilderModel.Student("张三",22); method1(stu); method2(stu); } public static class Student{ public String name; public int age; public Student(String name,int age){ this.name = name; this.age = age; } } public static void method1(Student stu){ stu.name = "李四"; } public static void method2(Student stu){ System.out.println(stu.name); } }
对于方法中的参数是对象时,前面加final是不影响修改这个对象里面的方法的。
如有任何缺陷请大家不吝赐教,必当洗耳恭听!