2013-05-17 5 views
-4

Android Reference에서 : RI와 일치하지만InflaterInputStream # available()이 Liskov 대체 원리를 위반하는 이유는 무엇입니까?

,이 동작)를 사용할 수 (과 일치, 그리고리스 코프 치환 원칙을 위반하는 것입니다. 이 메서드를 사용하면 안됩니다.

왜이 방법이 원칙을 위반합니까?

부차적 인 질문으로 RI는 무엇을 의미합니까?

+1

데이터베이스와 관련된 RI는 참조 무결성을 의미합니다. RI와 LSP를 이해하면 질문 자체가 답할 것입니다. – 323go

+1

이것은 데이터베이스와 아무런 관련이 없으므로이 예제의 RI는 참조 구현을 의미한다고 생각합니다. –

+1

@ 323go 본질적으로 * 어떤 * 질문에 대해서도 동일한 추론을 할 수 있습니다. C++/Java/C에 관한 질문? 그냥 사양을 읽어 가서 당신은 좋은거야. 안드로이드 참조가 Java API를 특별히 비판한다는 사실에 대해 물어볼 가치가 있습니다. – kolistivra

답변

1

API 설명서에 따르면이 겹쳐 쓰기 방법의 구현은 the superclass version과 동일한 보증을 제공하지 않습니다.

슈퍼 클래스, InputStream은 차단에 관해서는 다음과 같은 보증을 제공합니다

읽기 이상의 입력을 차단하지 않고 을 건너 뛸 수있는 바이트의 추정 수를 돌려줍니다.

이 방법은 약한 보증을 제공하므로 실제로는 이 유용하지 않습니다.

첫 번째로 보증은 "차단하지 않음"보다 이 아닌 "입력을 더 차단하지 않고"입니다. read는 I/O가 대기 중일 때까지 기다리는 것을 차단할 수 있습니다. 보증은 단지 기다릴 필요가 없다는 것입니다 쓸 데이터가 무기한으로 나타납니다. 이 방법의 결과는 이 차단되어서는 안되는 스레드에서 I/O를 수행하기위한 라이센스로 을 사용해서는 안됩니다. 하나의 결과가하거나 차단하지 않고, 상기 바이트가 반환 될 수 을 보장하지 않는다

:

그러나, 서브 클래스 InflaterInputStream 동일한 보장을 제공하지 않는다.

그러므로 차단 동작의 차이를 고려하지 않고 보통 InputStream 대신 InflaterInputStream을 사용할 수 없습니다.