《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。。。。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/13441.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论