我知道传递一个Object不是一个好习惯。但在这种情况下,它似乎是我的最佳解决方案。
public void doSomething(final Object obj) {
// some code
...
if (obj instanceof InputStream) {
document = PDDocument.load((InputStream) obj);
} else if (obj instanceof File) {
document = PDDocument.load((File) obj);
} else {
throw new IllegalArgumentException("Argument must be an instance of " + InputStream.class.getName() + " or " + " " + File.class.getName() + ".");
// more code
...
}
}
替代解决方案会有更多重复的代码(PDDocument.load(obj);
之前和之后的所有行)
public void doSomething(final InputStream obj) {
// some code
...
document = PDDocument.load(obj);
// more code
...
}
}
public void doSomething(final File obj) {
// some code
...
document = PDDocument.load(obj);
// more code
...
}
}
由于代码重复,我更喜欢第一种解决方案。
您知道解决此问题的更好解决方案吗?
答案 0 :(得分:6)
传递
的结果PDDocument.load(specificallyTypedVariable)
作为方法的参数。
这假设// some code
没有为load
电话做某种设置。如果是这种情况,您可以传递Function<? super T, PDDocument>
以及您要加载的T
:
public <T> void doSomething(final T obj, Function<? super T, PDDocument> loader) {
// some code
PDDocument document = loader.apply(obj);
// other code.
}
并调用如:
doSomething(someFile, PDDocument::load);
doSomething(someInputStream, PDDocument::load);
答案 1 :(得分:1)
由于PDDocument
可以从InputStream
加载而且你可以从InputStream
获得File
,我建议:
public void doSomething(final InputStream in)
{
// some code
document = PDDocument.load(in);
// more code
}
public void doSomething(final File file)
{
try (
final InputStream in = new FileInputStream(file);
) {
doSomething(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
当然,相应地处理错误!
另外,我不明白为什么你不返回document
并将该处理放在返回void
的方法中?
答案 2 :(得分:0)
移动
// some code
...
document = PDDocument.load(obj);
// more code
到单独的private
方法,只能由上述两种方法调用