• 《Effect Java》学习笔记1———创建和销毁对象


    第二章 创建和销毁对象

    1.考虑用静态工厂方法代替构造器

      四大优势

        i. 有名称

        ii. 不必在每次调用它们的时候都创建一个新的对象;

          iii. 可以返回原返回类型的任何子类型的对象;

          JDBC(Java Database Connectivity)

          服务提供者框架(Service Provider Framework)

             服务接口、提供者注册API、服务访问API、服务提供者接口(负责创建其服务实现的实例);

        iv. 在创建参数类型实例的对象,它们使代码变得更加简洁

      下面是一个Boolean(基本类型boolean的包装类)的基本实现:

    public static Boolean valueOf(boolean b) {
          return b ? Boolean.TURE : Boolean.FALSE;  
    }

       美中不足处

        ① 类如果不会含公有的或者受保护的构造器,就不能被子类化

        ② 与其他的静态方法实际上没有区别

      常用的名称

        valueOf  of  getInstance  newInstance  getType  newType

    2.遇到多个构造器参数时,要考虑使用构造器

        class.newInstance 破坏了编译时的异常检查(Builder弥补不足)

        总:如果类的构造器或静态工厂中具有多个参数,考虑用Builder模式;

      下面是示例:

     1 //Builder Pattern
     2 public class NutritionFacts
     3 {
     4     private final int servingSize;
     5     private final int servings;
     6     private final int calories;
     7     private final int fat;
     8     private final int sodium;
     9     private final int carbohydrate;
    10 
    11     public static class Builder
    12     {
    13         //Required parameters
    14         private final int servingSize;
    15         private final int servings;
    16 
    17         //Optional parameters - initialized to default values
    18         private int calories = 0;
    19         private int fat = 0;
    20         private int carbohydrate = 0;
    21         private int sodium = 0;
    22     
    23         public Builder(int servingSize, int servings)
    24         {
    25             this.servingSize = servingSize;
    26             this.servings = servings;
    27         }
    28 
    29         public Builder calories(int val)
    30         { calories = val;    return this; }
    31 
    32         public Builder fat(int val)
    33         { fat = val;    return this; }
    34 
    35         public Builder carbohydrate(int val)
    36         { carbohydrate = val;    return this; }
    37 
    38         public NutritionFacts build() {
    39             return new NutritionFacts(this);
    40         }
    41     }
    42 
    43     private NutritionFacts(Builder builder) {
    44         servingSize = builder.servingSize;
    45         servings = builder.servings;
    46         calories = builder.calories;
    47     }
    48 }

    3.用私有构造器或者枚举类型强化Singleton属性

      单元素的枚举类型已经成为实现Singleton的最佳方法

        实现方式一公有静态成员是一个final域

    //Singleton with public final field
    public class Elvis {
        public static final Elvis INSTANCE = new Elvis();
        private Elvis() {......}  
      
        public void leaveTheBuilding() {......}  
    }

        实现方式二:  公有的成员是个静态工厂方法

    //Singleton with static factory
    public class Elvis {
        private static final Elvis INSTANCE = new Elvis();
        private Elvis() {......}
        public static Elvis getInstance() { return INSTANCE;}
    
        public void leaveTheBuilding() {......}  
    }

        实现方式三(最佳实现方式)

            只需编写一个包含单个元素的枚举类型;

          这种方法在功能上与公有域方法相近,当是它更加简洁,无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。

    //Enum singleton - the preferred approach
    public enum Elvis {
        INSTANCE;
        
        public void leaveTheBuilding() {......}      
    }

          

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

      throw new AssertionError(); (构造器内)

      可在上面加入注释,便于理解,如下:

        suppress default coustructor for noninstratiability.

        示例如下:

    //Noinstantialbe utility class
    public class UtilityClass {
        //Suppress default constructor for noninstiability
        private UtilityClass() {
             throw new AssertionError();
        }  
        ......  //Remainder omitted
    }    

    5.避免创建不必要的对象

      update。。。。

  • 相关阅读:
    11.3 校内模拟赛
    11.2 模拟赛题解报告
    11.1 校内模拟赛题解报告
    CF710E Generate a String
    CF165E Compatible Numbers
    CF1092F Tree with Maximum Cost
    2021,10,29 模拟赛题解报告
    LCT学习笔记
    FFT 快速傅里叶变换学习笔记
    拉格朗日插值学习笔记
  • 原文地址:https://www.cnblogs.com/jesonjason/p/5536245.html
Copyright © 2020-2023  润新知