[英]Pass java.lang.Object as Parameter
我知道傳遞對象不是一個好習慣。 但是在這種情況下,這似乎是我的最佳解決方案。
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
...
}
}
由於代碼重復,我更喜歡第一個解決方案。
您知道解決此問題的更好解決方案嗎?
傳遞結果
PDDocument.load(specificallyTypedVariable)
作為方法的參數。
假定// some code
未對load
調用進行某種設置。 如果是這樣,您可以傳入Function<? super T, PDDocument>
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);
由於PDDocument
可以從InputStream
加載,並且無論如何您都可以從File
獲取InputStream
,所以建議:
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
的方法中?
移動
// some code
...
document = PDDocument.load(obj);
// more code
到單獨的private
方法,只能由上述兩個方法調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.