第1条:
第29条:优先考虑类型安全的异构容器
当一个容器(如Map)实现多种类型的key时,可以使用 Class
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
解决方案,在put时检查值是否是真的type所对应的实例
public void putV(Class type, T v){
map.put(type,type.cast(v));
}
第二种,有些类型不可以具体化,比如List
第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