2017-09-04 216 views
1

我知道传递一个Object不是一个好习惯。但在这种情况下,这似乎是对我来说最好的解决方案。传递java.lang.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 
    ... 
    } 
} 

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

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

+0

混合起来。有两个独立的方法调用与重复代码共享的方法。 – Stultuske

回答

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

我会使用这个想法,3个方法(两个具有特定参数,将实例化文档并调用第三个私人接受将具有完整逻辑的“PDDocument文档”),简单且正确地输入。我想这是你的想法behing这个答案。 – AxelH

+2

@AxelH这里的想法是德米特法则(最少知识原则)。该方法不需要知道文档是从文件加载的,从流中读取等:它只需要文档。值得注意的是,只传递你需要的东西使得代码更简单(只需要1个方法)*和*更灵活(你可以对来自更广泛来源的文档“做些什么”)。 –

0

移动

// some code 
... 
document = PDDocument.load(obj); 
// more code 

到一个单独的private方法,其可以仅由上述的两种方法被称为

1

由于PDDocument可以从InputStream加载和你可以从一个FileInputStream反正,我建议:

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); 
    } 
} 

赛道中e,相应地处理错误!


另外,我不明白为什么你不回的document,并将该处理返回void的方法?

+1

nit:“如果资源规范中声明的变量未明确声明为final,则隐式声明为final(§4.12.4)。”使其明确地最终只是噪声,海事组织:) –

+0

也许增加“...一些代码...”的部分到'InputStream'重载,以更清楚地说明如何减少代码重复。 – Kayaman

+0

这个想法的一个小小的变化是:不要为'File'提供一个重载:只要让它成为你必须传入的'InputStream';来电者可以决定如何做到这一点。 –