2014-09-03 46 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); 
    } 
}