2014-04-10 64 views
2

我們是否需要一個接口/合同?我想創建一個有兩種方法的接口,如uploadFiledownloadFile。雖然我只需要實現者來實現這兩種方法,但我不確定並想關心這些方法需要採取什麼論點。我的意思是,不同的執行者可能會要求不同的參數。在這種情況下,我應該仍然繼續通過創建使上述方法爲VAR-ARG方法的接口,像下面如果我們不能概括方法參數

boolean uploadFile(Object ... parameters) 
OutputStream downloadFile(Object ... parameters) 

還是說沒有比這更好的辦法?如果我不能概括方法參數,創建接口是否正確?我只知道方法名稱和返回類型。

+2

如何使用泛型?處理對象類型對於API來說並不是一個好設計..我們可以通過......任何我們想要的東西......這將需要被施放(如果/其他角度看起來很醜陋) – Mik378

回答

2

這可能是泛型的用例。考慮下面的類安排 - 在這裏我們定義一個抽象的「參數」類型並在界面中引用它。具體類使用特定的參數集。

abstract class HandlerParams {  
}  

interface FileHandler<T extends HandlerParams> { 
    boolean uploadFile(T parameters); 
    OutputStream downloadFile(T parameters); 
} 

示例實現:

class URLParams extends HandlerParams { 
    // whatever... 
} 

class URLFileHandler implements FileHandler<URLParams> { 

    @Override 
    public boolean uploadFile(URLParams parameters) { 
    // ... 
    } 

    @Override 
    public OutputStream downloadFile(URLParams parameters) { 
    // ... 
    }  
} 

我必須承認,我掙扎想象場景中這種安排將是有益的。我想你可以有一些與文件處理工作,但感覺有點假:如果你有一個基礎上,實現者類型不同的參數類型/計數打電話,你有兩種常見的選擇

class SomethingThatUsesFileHandlers { 
    public <T extends HandlerParams> void doSomething(FileHandler<T> handler, 
     T params) { 
    handler.downloadFile(params); 
    } 
} 
0

我認爲這還是可以的,因爲您至少有合同中定義的uploadFiledownloadFile方法。但它允許太多的可能性,因爲您將Object...定義爲這兩種方法的參數。也許更好的方法是爲這些參數定義一些具體的選項並堅持下去。您可以通過這兩種方法的幾個重載版本來完成此操作,例如

boolean uploadFile(File)

boolean uploadFile(File...)

boolean uploadFile(File[])

,然後執行相同的

downloadFile方法。

0

也許你應該使用generic interface

public interface XXXX<T> { 
    boolean uploadFile(T... parameters) 
    OutputStream downloadFile(T... parameters) 
} 
1

  • 期廣義參數本身到一個單獨的類型 - 這可以幫助你在靜態類型的檢查
  • 放棄界面完全成本統一接口 - 如果你需要統計ic類型檢查,您建議的選擇(離開接口)是有效的。

這裏是你如何實現第一種方法:

interface HandlerParameters { 
    void setValue(String mame, Object value); 
    Object getValue(String name); 
    String[] getNames(); 
} 
interface UploadDownloadHandler { 
    boolean uploadFile(HandlerParameters parameters); 
    OutputStream downloadFile(HandlerParameters parameters); 
    HandlerParameters makeParameters(); 
} 

調用者可以調用makeParameters,使空參數塊,填充參數值根據需要,並繼續呼籲uploadFiledownloadFile

相關問題