2015-04-22 47 views
0

有什麼辦法可以實現StringReader類,它允許在不改變其任何功能(方法)的情況下重複使用具有多個字符串的相同StringReader(或類似功能)對象?可重複使用的Java StringReader

例如,這樣的一個Java類(比如,ReusableStringReader)將是​​3210一個亞類中,與像

public void reset(String str); 

一個額外的方法,該方法將在新的字符串值指定到內部StringReader參數,以便對StringReaderread()方法的所有後續調用均使用新值。當想要限制應用程序使用的對象數量時(例如,通過對象每秒處理大量字符串的對象數量),這種「可重用性」非常方便。

通用的方式來實現,這將是:

  1. 繼承。 StringReader的所有內部狀態都存儲在私有實例變量中,所以這不是一個選項。
  2. 反思。通過反射重置StringReader對象的內部狀態。有4個實例變量可以設置,這意味着每個「重置(字符串)」調用4個反射調用(不是太高效)。
  3. 構圖。可以使用可重複使用的StringInputStream,然後通過InputStreamReader創建Reader對象,然後在StringReader的子類內部使用Reader來實現StringReader類的完整API。雖然這是相當黑客。

更好的解決方案的任何想法?

+0

請刪除「off-topic」限制。這是關於解決現實世界問題的潛在實施的非常有效的問題,在問題測試中已經非常清楚地描述了這個問題。我重寫了它以刪除術語「開源實現」,但即使這樣也不是必需的。這裏沒有什麼是「自以爲是」的。 – PNS

回答

3

我認爲你很可能過早地優化了一個沒有問題的地方,除非你實際測量過看到StringReader實例導致嚴重的GC壓力。由於閱讀內容而產生的分配更有可能更有意義。

所以我根本不用擔心可重用性:use-once實例更安全,更簡單。一般來說,實際上通過重新使用諸如閱讀器的輕重量物體而獲益是相對罕見的。

但是,如果您仍想追求此目標,只需編寫自己的Readerreset(),並且不必擔心JDK變體。你可以偷看實現,但它很簡單。嘗試子類,委託或撰寫幾乎沒有什麼好處:特別是如果您真的擔心數量最少的分配。

+0

每行處理使用一個新的'StringReader'是一種方法,就像創建另一種類型的'Reader'一樣。但是如果我想要一個StringReader,那麼按照原始問題呢? :-) – PNS

+0

啊 - 是否有人期待'StringReader'被傳遞?如果是這樣,一個可能性是分類,但重新實施......因爲現有的字段會被忽略,並且不夠優雅,但是會允許type作爲'StringReader'傳遞而不需要每行實例化。實際上我不得不做類似於另一個JDK I/O類(我忘記了哪一個),當API期望一個具體類型時。 – StaxMan

+0

是的,子類本質上意味着複製所有的'StringReader'代碼,只是添加一個做一些分配的方法。這正是我發佈這個問題的原因。感謝和+1。 :-) – PNS