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

将java.lang.Object作为参数传递,java,Java,我知道传递物体不是一个好的练习。但在这种情况下,这似乎是最好的解决办法 public void doSomething(final Object obj) { // some code ... if (obj instanceof InputStream) { document = PDDocument.load((InputStream) obj); } else if (obj instanceof File) { do

我知道传递物体不是一个好的练习。但在这种情况下,这似乎是最好的解决办法

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);前后的所有行)

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

你知道解决这个问题的更好办法吗?

移动

// some code
...
document = PDDocument.load(obj);
// more code
到一个单独的
private
方法,该方法只能由上述两个方法调用

// some code
...
document = PDDocument.load(obj);
// more code
到一个单独的
private
方法,该方法只能由上述两个方法调用

PDDocument.load(specificallyTypedVariable)
作为方法的参数


这假设
//some code
没有为
load
调用执行某种设置。如果是这种情况,您可以传入一个
函数传入

PDDocument.load(specificallyTypedVariable)
作为方法的参数



这假设
//some code
没有为
load
调用执行某种设置。如果是这种情况,您可以传入
函数,因为
PDDocument
可以从
InputStream
加载,并且您可以从
文件
获取
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);
    }
}
当然,要相应地处理错误



另外,我不明白为什么您不返回
文档
,并将该处理放在返回
void

的方法中,因为
PDDocument
可以从
InputStream
加载,并且您可以从
文件
获取
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);
    }
}
当然,要相应地处理错误



另外,我不明白为什么您不返回
文档
,并将该处理放在返回
void

的方法中,将它们混在一起。有两个单独的方法调用具有重复代码的共享方法。请将它们混合起来。有两个单独的方法,用重复的代码调用共享方法。我会使用这个想法,3个方法(两个方法带有特定的参数,将实例化文档并调用第三个私有方法,接受将具有完整逻辑的
PDDocument文档),简单且正确地键入。我猜这是你的想法,答案是这样的。@AxelH这里的想法是德米特定律(最少知识的原则)。该方法不需要知道文档是否从文件加载、是否从流读取等:它只需要文档。值得注意的是,只传递您需要的东西会使代码更简单(只需要一种方法)和更灵活(您可以
doSomething
处理来自更广泛来源的文档)(两个具有特定参数的参数将实例化文档,并调用第三个私人接受具有完整逻辑的
PDDocument文档
),简单且正确地键入。我猜这是您在回答此问题时的想法。@AxelH这里的想法是Demeter定律(最少知识原则)。该方法不需要知道文档是否从文件加载、是否从流读取等:它只需要文档。值得注意的是,仅传递所需的内容就可以使代码更简单(只需要1种方法)和更灵活(您可以
doSomething
处理来自更广泛来源的文档)。nit:“如果资源规范中声明的变量未显式声明为最终变量,则该变量隐式声明为最终变量(§4.12.4)。”将其显式声明为最终变量只是噪音,IMO:)可能会添加“…某些代码…”。。。“对
InputStream
重载的一部分,以更清楚地说明这是如何减少代码重复的。这个想法的一个微小变化是:根本不要为
文件提供重载:只需使其成为必须传入
InputStream
;调用者可以决定怎么做。@AndyTurner嗯。。。我不知道:)我会记住的。我有点太过了
final
-happy:)nit:“资源规范中声明的变量如果没有显式声明为final,则隐式声明为final(§4.12.4)。”将其显式声明为final仅仅是噪音,IMO:)可以添加“…某些代码…”
InputStream
重载的一部分,以更清楚地说明这是如何减少代码重复的。这个想法的一个微小变化是:根本不要为
文件提供重载:只需将其设置为必须传入
InputStream
;调用者可以决定怎么做。@AndyTurner嗯。。。我不知道:)我会记住的。我有点过分了
final
-高兴:)