Effective Java 第二章:创建和销毁对象

  1. 第2条:遇到多个构造器参数时要考虑用构建器

    1. JavaBeans模式
      做法:对类中的成员变量提供set方法
      缺点:阻止了把类做成不可变的可能
    2. 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模式就是种不错的选择。

  2. 第4条:通过私有构造器强化不可实例化的能力

    1. 如果一个类被设计成不可实例化的,那么把这个类的构造器设置为private是最好的选择。如果同时还不想被子类化,那么构造器中就抛异常,因为子类的构造器会显示或隐式的调用父类的构造器。
  3. 第5条:避免常见不必要的对象

    1. 通过这种方法创建对象:
      String example = new String("string");
      首先”string”是一个实例,new又创建了一个实例,所以这种语句一共创建了两个实例,但是我们使用到了一个。所以不推荐这个方法。
    2. 优先使用基本数据类型而不是装箱类型,即使用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实例。

猜你喜欢

转载自blog.csdn.net/space_walk/article/details/78470408