簡體   English   中英

傳遞java.lang.Object作為參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM