将java.lang.Object作为参数传递

时间:2017-09-04 07:04:27

标签: java

我知道传递一个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
    ...
    }
}

由于代码重复,我更喜欢第一种解决方案。

您知道解决此问题的更好解决方案吗?

3 个答案:

答案 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方法,只能由上述两种方法调用