假设我有一个数据类,它包含一个三维向量。
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
的书要读怎么办?
DataInputStream
是InputStream
上的一个精简包装器,几乎没有自己的资源。他们的close()
方法只关闭被包装的输入流。创建大量对象只意味着创建许多临时对象供GC收集。创建和丢弃许多DataInputStream
对象没有危险,但如果您试图优化性能,则可能需要避免它
另一方面,试图支持所有输入流类型对我来说似乎过于泛化。我会让该方法只接受DataInputStream
或DataInput
接口。
据我所知,你打算做的是安全的。(DataInputStream
不做任何缓冲……尽管如果使用不推荐使用的readLine
方法,预读可能会出现问题。(
然而,创建大量临时DataInputStream
实例确实会产生相关成本,因此如果您关心性能,则应避免这样做。
当然,我希望它支持所有InputStream类型。。。。
我看不出"当然"。如果它会对性能产生影响,那么您可能不应该这样做。仅仅因为你认为某人可能想使用过载而这么做可能是个坏主意。
另一方面,您可以让使用API的程序员来决定是否使用"便利"重载。
将签名更改为DataInputStream,并强制调用方提供它。然后保存它们是调用方的问题:-(但他也比你更好地保存它们。