EffecitveJava 第三章

类和接口

1.使类和成员的可访问性最小,尽量隐藏内部的细节把他的API与是实现隔离出来。公有类不应该包含公有域。并且要确保公有静态final域所引用的对象都是不可变的

如果类具有这样的域或者访问方法,客户端能够修改数组的内容。这是要给安全问题

public static final Thing[] VALUES={....};
虽然引用本身不能被修改,但是它所引用的对象确实可以被修改的。

应该改为
private static final Thing[] PRIVATE_VALUES={...};

public static final List<Thing> VALUES=Collection.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
另一种方法是

private static final Thing[] PRIVATE_VALUES={...};
public static final Thing[] values(){
   return PRIVATE_VALUES.clone();
}

2.在共有类中是使用访问方法而非公有域,即getset 可以在内部做其他业务逻辑的判断。

3。使可变类最小化
不可变类比可变类更加容易设计和实现,使用。而且不容易出错,且安全。
为了让类成为不可变,要遵循的五大规则
1.不要提供任何会修改对象状态的方法。
2.保证类不会被扩展
3.是所用的域都是final的
4.使所有的域都成为私有的
5.确保对于任何可变组件的互斥访问

4.复合优先于集成.
子类依赖于超累中特定的功能实现细节。如果超类被修改,子类可能会遭到破坏,即使它的代码完全没有改变。导致子类必须要跟着其超累的更新而演变。

public class InstrumentedHashSet<E> extends HashSet<E>{
    private int addCount=0;
    public InstrumentedHashSet(){
    }
    public InstrumentedHashSet(int initCap,float loadFactor){
     super(initCap,loadFactor);
    }
    @Overide
    public boolean add(E e){
    addCount++;
    return super.add(e);
    }
     @Overide
    public boolean addAll(Collection<? extends E> c){
    addCount+=c.size();
    return super.addAll(e);
    }
    public int getAddCount(){
     return addCount;
    }
   
}
这个类看上去很合理,但是他并不能正常运行。InstrumentedHashSet<String> s=new InstrumentedHashSet<String>();
s.addAll(Arrays.asList("xiaoming","xiaohong","xiaoguang"));
我们getAddCount是3 但是实际是6 因为HashSet 的addAll调用的是add的方法。 只要我们去掉覆盖的addAll()方法就可以了。
   HashSet的addAll方法是在add方法上实现的,这种自用性 是实现的细节,不能保证在Java平台的所有实现都保存不变,不能保证随着发现版本的不同而不发生变化,所以这个InstrumentedHashSet是非常脆弱的。
  幸运的是可以采用一种设计称为复合 来解决
  通过一个类来实现Set的接口完成需求这种行为称之为转发(和装饰模式有点像) 然后来继承这个新类

4。接口有限于抽象类
如果无更新现有 的类来扩展新的抽象类,你希望让两个类扩展同一个抽象类,就必须要不把抽象类放到类型的层次的高处,以便让这两个类的一个祖先成为它的子类。但是这样会伤害到类的层次。
接口是定义混合类型的理想选择 即mixin类型,类除了实现它的基本类型之外,和可以实现这个类型。以表面它提供选择的行为,如Comparable是一个mixin接口它允许类表面它的实力可以与它的相互比较的对象进行排序。但是抽象类不能,类不可能有多个父类,到此它没地方出入mixin。
接口云溪我们构建非层次结构的类型框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值