InputStream in = ...;
in b = in.read();
對InputStream的讀取操作可能發(fā)生三種情況:
- 異常,拋出IOException;
- 讀取到一個字節(jié)浅妆;
- 到達輸入流的結(jié)尾畴蹭。
其中第2種情況應該返回一個字節(jié)(Java中字節(jié)的取值范圍是-128~127),第3種情況應該返回一個表示“end of file”的特殊對象(暫且叫做EofObject
)。所以read()
的返回值類型應該是Union<Byte, EofObject>
。
但是Java用int
這一種類型表示了2種情況:
- 0~225的整數(shù)表示一個字節(jié);
- -1表示輸入流的結(jié)尾辅柴。
這種做法帶來了一些問題:
- -1的存在導致了read返回的字節(jié)無法直接用Java的byte類型表示,造成了空間浪費瞭吃;
- 將read返回的int cast成byte前需要校驗值是否為-1碌嘀,忘記校驗或者不小心多做了一次cast都可能引入bug。
P.S. 這里的Union應該是Typed Racket的那種“checked union”歪架,而不是C那樣的“unchecked union”股冗。