为什么InflaterInputStream#available()违反Liskov替换原则?

时间:2013-05-17 13:58:33

标签: java android inflate deflate liskov-substitution-principle

来自Android Reference

  

尽管与RI一致,但这种行为与此不一致   可用(),违反Liskov替代原则。这个   方法不应该使用。

这种方法为何以及如何违反原则?

作为一个附带问题,RI代表什么?

1 个答案:

答案 0 :(得分:1)

根据API文档判断,这种覆盖方法的实现不能提供与the superclass version相同的保证。

超类InputStream在阻止方面提供以下保证:

  

返回可以读取或跳过的估计字节数   没有阻止更多输入。

     

请注意,此方法提供了一种弱保证,即它不是   在实践中非常有用。

     

首先,保证是“没有阻止更多输入”   比“不阻塞”:读取可能仍然阻止等待I / O.   完成 - 保证仅仅是它不必等待   无限期地写入数据。这种方法的结果应该是   不能用作在不应该的线程上进行I / O的许可证   阻止。

但是,子类InflaterInputStream不提供相同的保证:

  

1的结果不保证可以返回更多字节,   有或没有阻止。

因此,如果不考虑阻止行为的差异,则无法使用InflaterInputStream代替普通InputStream