• 创建和销毁对象


    • 第一条: 使用静态工厂方法代替构造函数

      这里说的静态工厂方法并不直接对应于设计模式中的工厂方法,它具有一下几个优势:

    1. 与构造器相比,静态工厂方法具有名称,如下所示。
    class Child{
        int age = 10;
        int weight = 30;
        public static Child newChild(int age, int weight) {
            Child child = new Child();
            child.weight = weight;
            child.age = age;
            return child;
        }
        public static Child newChildWithWeight(int weight) {
            Child child = new Child();
            child.weight = weight;
            return child;
        }
        public static Child newChildWithAge(int age) {
            Child child = new Child();
            child.age = age;
            return child;
        }
    }

    2.不必在每次调用时都创建新对象,单例模式一般都是用静态工厂方法

    3.可以返回原返回类型的任何子类型对象,这也是典型的里氏替换原则,如下所示:

    class Person{
        public Person newInstance(){
           //return new Person();       
            return new Zhangsan();
         }
    }
    
    class Zhangsan extends Person{
    
    }
    • 遇到多个构造器参数时,考虑使用构建器

    碰到这种多参数构造器(有必选也有可选项),很多人会使用重叠构造方法,这种方法仅适用于参数较少情况,当参数太多,并且还有不少可选参数时将难以调用,这时,Builder模式将派上用场,如下所示:

    public class User {
      private final String firstName; // required
      private final String lastName; // required
      private final int age; // optional
      private final String phone; // optional
      private final String address; // optional
     
      private User(UserBuilder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.age = builder.age;
        this.phone = builder.phone;
        this.address = builder.address;
      }
     
      public static class UserBuilder {
        private final String firstName;
        private final String lastName;
        private int age;
        private String phone;
        private String address;
     
        public UserBuilder(String firstName, String lastName) {
          this.firstName = firstName;
          this.lastName = lastName;
        }
     
        public UserBuilder age(int age) {
          this.age = age;
          return this;
        }
     
        public UserBuilder phone(String phone) {
          this.phone = phone;
          return this;
        }
     
        public UserBuilder address(String address) {
          this.address = address;
          return this;
        }
     
        public User build() {
          return new User(this);
        }
      }
    
     
      public String getFirstName() {
        return firstName;
      }
     
      public String getLastName() {
        return lastName;
      }
     
      public int getAge() {
        return age;
      }
     
      public String getPhone() {
        return phone;
      }
     
      public String getAddress() {
        return address;
      }
    }
    • 用私有构造方法或者枚举类型强化Sington
    • 通过私有构造方法强化不可实例化的能力
    • 避免创建不必要的对象

    一般来说,能重用对象就应该尽可能重用,而不是每次使用时就创建新对象,如果是对象创建后不再改变的,或者本身是不可变对象,更应该如此。一个比较常见的例子是自动装箱和拆箱,如下所示:

    //以下代码创建了2^31个Long对象!每次累加时都会创建一个,因此必须优先使用基本类型而不是包装类型
    public static void main(String[] args){
        Long sum = 0;
        for(long i = 0;i < Integer.MAX_VALUE; i++){
            sum += i;
        }
    }
    • 消除过期的对象引用

    虽然jvm的GC机制已经非常强大,但在一些情况下,仍然存在内存泄漏风险,一般来说,只要类时自己管理内存(自己定义了堆栈或是缓存),就应该警惕内存泄漏的问题!

    • 避免使用终结方法

    终结方法通常不可预测,也很危险,它的执行时间点是不确定的,执行花费的时长也很长(大概消耗2400ns),即使要使用,也应该在finally异常块中使用。

  • 相关阅读:
    [Luogu] P1886 滑动窗口
    [Luogu] P1195 口袋的天空
    [Luogu] P1331 海战
    [Luogu] P3952 时间复杂度
    运营活动如何防刷
    考研政治刷题小程序
    考研刷题小程序
    在线答题活动小程序
    知识竞答小程序v2.0
    知识竞答小程序
  • 原文地址:https://www.cnblogs.com/loveBolin/p/9614919.html
Copyright © 2020-2023  润新知