正在转储大量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的书要读怎么办?

DataInputStreamInputStream上的一个精简包装器,几乎没有自己的资源。他们的close()方法只关闭被包装的输入流。创建大量对象只意味着创建许多临时对象供GC收集。创建和丢弃许多DataInputStream对象没有危险,但如果您试图优化性能,则可能需要避免它

另一方面,试图支持所有输入流类型对我来说似乎过于泛化。我会让该方法只接受DataInputStreamDataInput接口。

据我所知,你打算做的是安全的。(DataInputStream不做任何缓冲……尽管如果使用不推荐使用的readLine方法,预读可能会出现问题。(

然而,创建大量临时DataInputStream实例确实会产生相关成本,因此如果您关心性能,则应避免这样做。


当然,我希望它支持所有InputStream类型。。。。

我看不出"当然"。如果它会对性能产生影响,那么您可能不应该这样做。仅仅因为你认为某人可能想使用过载而这么做可能是个坏主意。

另一方面,您可以让使用API的程序员来决定是否使用"便利"重载。

将签名更改为DataInputStream,并强制调用方提供它。然后保存它们是调用方的问题:-(但他也比你更好地保存它们。

相关内容

  • 没有找到相关文章

最新更新