Effective Java2 摘要

第1条:

第29条:优先考虑类型安全的异构容器

当一个容器(如Map)实现多种类型的key时,可以使用 Class来作为key

    Map,Object> map = new HashMap<>();
    
    public  void putV(Class type, T v){
        map.put(type,v);
    }
    
    public  T getV(Class type){
        return  type.cast(map.get(type));
    }

这种方式有两种局限性:
第一种,原生态形式使用Class对象,可以通过检查, 例如List 和 List 的原生态Class对象是 List.class
解决方案,在put时检查值是否是真的type所对应的实例

  public  void putV(Class type, T v){
        map.put(type,type.cast(v));
  }

第二种,有些类型不可以具体化,比如List没有对应的Class对象,只有原生态形式擦除了类型 List.class

第30条,用枚举代替int常量

用int类型列举的方式叫做int枚举模式,存在诸多不足,比如可以任意赋值没有任何检查.同样的还有String枚举模式
枚举提供编译时的类型安全
枚举可以重新排列或修改,不用重新编译客户端代码
枚举可以添加方法和域,并实现任意接口

第31条,用实例域代替序数

枚举默认和一个单独的int值关联,所有默认枚举有个ordinal方法,返回枚举常量在类型中的数字位置

public enum Ensemble{
      SOLO,DUET
      
    public int getPosition(){
          return ordinal()+1000;
    }
}

但是如果调整位置,就会导致使用ordinal相关的方法被破坏,这种情况可以通过添加域来保存相关信息

public enum Ensemble{
      SOLO(1),DUET(2)
      
    private final int position;
    Ensemble(int position){this.position = position}
    public int getPosition(){
          return position;
    }
}

第32条,用EnumSet 代替位域

枚举类型用在集合中时,允许联合使用,int枚举模式如下

public class Text{
    public static final int STYLE_BOLD = 1<<0; //1
    public static final int STYLE_ITALIC = 1 <<1;

    public void applyStyles(int styles){...}

}

//使用
text.applyStyles(STYLE_BOLD|STYLE_ITALIC)

这种可以 使用EnumSet

public class Text{
    
    public enum Style{ BOLD,ITALIC }

    public void applyStyles(Set