-4

来自Android 参考

这种行为虽然与 RI 一致,但与 available() 不一致,违反了 Liskov 替换原则。不应使用此方法。

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

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

4

1 回答 1

1

从 API 文档来看,这种重写方法的实现并没有提供与超类版本相同的保证。

超类InputStream为阻塞提供以下保证:

返回可以读取或跳过的估计字节数,而不会阻塞以获取更多输入。

请注意,此方法提供的保证很弱,因此在实践中不是很有用。

首先,保证是“不阻塞以获取更多输入”而不是“不阻塞”:读取可能仍会阻塞等待 I/O 完成——保证仅仅是它不必无限期地等待数据写入. 此方法的结果不应用作在不应阻塞的线程上执行 I/O 的许可。

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

结果为 1 并不能保证可以返回更多字节,无论是否阻塞。

因此,如果不考虑阻塞行为的差异,就不能使用InflaterInputStream代替法线。InputStream

于 2013-05-17T14:27:30.527 回答