投射到读者或创建新的阅读器

时间:2014-09-03 18:36:56

标签: java casting bufferedreader

我对以下事情感到有点困惑:

public randomConstructor(Reader r) {
    this.bufferedreader = new BufferedReader(r);
}

似乎合乎逻辑的是,如果你想使用BufferedReader,你应该创建一个并使用阅读器作为参数。但是,我看到了类似的东西:

public randomConstructor(Reader r) {
    this.bufferedreader = (BufferedReader) r;
}

如果r本身不是BufferedReader,那么它就不起作用了。

很抱歉,如果我不能给你任何更好的例子,但我记得有一个例子,它实际上是有意义的把它投入读者。是否有任何例外情况?

编辑:bufferedreader显然是“BufferedReader”类型的私有变量:)

2 个答案:

答案 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);
    }
}