2017-09-04 198 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';來電者可以決定如何做到這一點。 –