2014-07-13 18 views
0

比方說,我有一個保存三維向量的數據類。是否傾倒了很多DataInputStreams不好的做法?

class Vec3 { 
    float x, y, z; 
    public Vec3(float x, float y, float z) { /* ... */ } 
} 

然後我想給它從流中讀取的功能。我有漂浮物,所以最簡單的選擇是DataInputStream

public static Vec3 read(DataInputStream in) { 
    float x = in.readFloat(); 
    float y = in.readFloat(); 
    float z = in.readFloat(); 
    return new Vec3(x, y, z); 
} 

而且,當然,我希望它支持所有InputStream類型。所以,我將創建一個包裝任何流的重載。

public static Vec3 read(InputStream in) { 
    return read(new DataInputStream(in)); 
} 

然而,這種方法創建一個DataInputStream這是從來沒有關閉,看完後只是把。這是不好的做法,它可以導致問題嗎?如果我有很多Vec3要讀?

回答

2

A DataInputStream是一個超薄的包裝InputStream,幾乎沒有自己的資源。他們的close()方法只關閉包裝的輸入流。創建它們只意味着爲GC收集許多臨時對象。在創建和丟棄許多對象時沒有任何危險,但是如果您嘗試優化性能,則可能需要避免這種情況。

另一方面,試圖支持所有輸入流類型對我來說似乎是過度泛化。我會使該方法只接受DataInputStreamDataInput接口。

1

據我所知,你打算做的事情是安全的。 (A DataInputStream沒有做任何緩衝......雖然有與預讀一個潛在的問題,如果您使用的過時readLine方法。)

但是,創建大量的臨時DataInputStream實例確實有相關的成本,因此,如果你關心的表現你應該避免這樣做。


,當然,我希望它支持所有的InputStream類型....

我沒有看到 「當然」。如果它有性能影響,那麼也許你不應該做到這一點。簡單地做,因爲你認爲有人可能想要使用過載可能是一個壞主意。另一方面,您可以將其留給正在使用您的API的程序員來決定是否使用「便利」重載。

0

將簽名更改爲DataInputStream並強制調用方提供它。然後保護他們是來電者的問題:-)但是他也比你更能保護他們。

相關問題