将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
-高兴:)