我对以下事情感到有点困惑:
public randomConstructor(Reader r) {
this.bufferedreader = new BufferedReader(r);
}
似乎合乎逻辑的是,如果你想使用BufferedReader,你应该创建一个并使用阅读器作为参数。但是,我看到了类似的东西:
public randomConstructor(Reader r) {
this.bufferedreader = (BufferedReader) r;
}
如果r本身不是BufferedReader,那么它就不起作用了。
很抱歉,如果我不能给你任何更好的例子,但我记得有一个例子,它实际上是有意义的把它投入读者。是否有任何例外情况?
编辑:bufferedreader显然是“BufferedReader”类型的私有变量:)
答案 0 :(得分:1)
执行未经检查的演员表总是很危险,应该避免。
第一个构造函数是一个使用名为Decorator的模式的好例子。 BufferedReader
装饰传入的Reader
对象。如果你正在设计一个可以接受任何类型Reader
的类,并且有许多类,你可以轻松地用BufferedReader
包装该读者,并获得缓冲带来的好处,具有多态构造函数的好处
可能有意义的唯一情况是传入的构造函数是否已经是BufferedReader
。可能没有必要用另一个BufferedReader
包装它。在这种情况下,您可以执行instanceof
检查,如下所示:
public randomConstructor(Reader r) {
if (r instanceof BufferedReader) {
this.bufferedreader = (BufferedReader) r;
} else {
this.bufferedreader = new BufferedReader(r);
}
}
或者,您也可以提供一个重写的构造函数,除了期望BufferedReader
的{{1}}之外,还需要Reader
。
答案 1 :(得分:0)
我很挣扎,无法找到您知道r
类型为BufferedReader
但仍有充分理由将其作为Reader
传递的情景。< / p>
对我来说更有意义的是将第二个版本修改为:
public randomConstructor(Reader r) {
if (r instanceof BufferedReader) {
this.bufferedreader = (BufferedReader) r;
}
else {
this.bufferedreader = new BufferedReader(r);
}
}