第2条:遇到多个构造器参数时要考虑用构建器
- JavaBeans模式
做法:对类中的成员变量提供set方法
缺点:阻止了把类做成不可变的可能 - builder模式
做法:类中提供一个名为Builder的内部类,该类包含一个构造器,参数为外部类中必须初始化的成员变量。同时还要有外部类中成员变量的set方法(方法名不一定含有set字样),而且这些方法返回”自己”(this)。最后要有一个build方法,该方法返回一个新创建的外部类对象,并把”自己”作为初始化参数。外部类的构造函数要有一个Builder对象作为参数,把Builder对象中的数据传给自己的成员变量。
class Student { private String name; private String number; private String id; private double weight; class Builder { private String name; private String number; private String id = ""; private double weight = 0; public Builder(String val_1, String val_2) { name = val_1; number = val_2; } public Builder id(String val) { id = val; return this; } public Builder weight(double val) { weight = val; return this; } public Student build() { return new Student(this); } } private Student(Builder builder) { name = builder.name; number = builder.number; id = builder.id; weight = builder.weight; } }
创建Student对象的语法如下:
Student student = new Studnet.Builder("l", "5").id("1").weight(1).build();
注:如果类的构造器或者静态工厂中具有多个参数,设计这种类时Builder模式就是种不错的选择。
- JavaBeans模式
第4条:通过私有构造器强化不可实例化的能力
- 如果一个类被设计成不可实例化的,那么把这个类的构造器设置为private是最好的选择。如果同时还不想被子类化,那么构造器中就抛异常,因为子类的构造器会显示或隐式的调用父类的构造器。
第5条:避免常见不必要的对象
- 通过这种方法创建对象:
String example = new String("string");
首先”string”是一个实例,new又创建了一个实例,所以这种语句一共创建了两个实例,但是我们使用到了一个。所以不推荐这个方法。 - 优先使用基本数据类型而不是装箱类型,即使用int而不是Integer,使用long而不是Long。要当心无意识的自动装箱。(每次对装箱类型改变数据时,都会创建一个装箱实例。)
public static void main(String[] args) { Long sum = 0L; for (long i = 0; i < Integer.MAX_VALUE; ++i) { sum += i; } System.out.println(sum); }
这个例子中,每次往Long sum中增加long时构造一个Long实例。
- 通过这种方法创建对象:
Effective Java 第二章:创建和销毁对象
猜你喜欢
转载自blog.csdn.net/space_walk/article/details/78470408
今日推荐
周排行