2014-09-03 48 views
-1

我对以后的事弄得一点点:投射到读者或创建一个新的读者

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

这似乎是合乎逻辑的,如果你想使用一个BufferedReader,你应该建立一个与使用读者作为参数。然而,我看到类似的东西:

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

如果r不是一个BufferedReader本身,它显然不工作。

对不起,如果我不能给你一个更好的例子,但我可以记住,有一个例子,它有实际意义,把它投给读者。有没有例外,它是有道理的?

编辑:BufferedReader中显然是我挣扎,找不到在哪你知道rBufferedReader型的,但仍然有很好的理由来的情景类型“的BufferedReader” :)

+0

在这种情况下铸造是相当危险的,因为你打开了一个'ClassCastException'。如果你知道你将需要一个'BufferedReader',那么你最好使参数类型反映它,或者自己创建一个,就像你在第一个例子中做的那样。 – azurefrog 2014-09-03 18:39:49

+0

@azurefrog我看到了,所以在一天结束时,这只是一个愚蠢的想法,对吧? – Goldi 2014-09-03 18:40:46

+0

@DennisvonEich A.一个'Reader'不能是'BufferedReader',并且B.你不应该有一个只读对象的构造函数(比如Streams)。更好地使用源读取。 – Hannes 2014-09-03 18:48:12

回答

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

或者,您也可以提供一个重写的构造函数,除了期望一个Reader的一个期望一个BufferedReader

0

的私有变量通过它作为Reader

将使什么更有意义(我)是有第二个版本修改为:

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