2014-01-23 35 views
0

我創建數據庫訪問的API參數類型變化@deprecated。用法與方法定義

已經有使用我們的API.In這種情況下,如果我想從界面更改參數的類型的類型實現一個應用程序。

例如,

API 1.0版本:

getDomain1Data(SearchBy searchBy,List<String> someList); 

我可以改變這下面?我想確保API用戶不會搜索domain1數據與另一個域的表列名稱。

getDomain1Data(Domain1SearchBy searchBy,List<String> someList); 

如果我這樣做,我應該加棄用第一種方法,然後添加第二個方法或者我可以只更換第二個第一種方法。

謝謝。

回答

1

如果已經有它使用你的接口方法是不明智刪除以前的方法的應用。 我寧願添加getDomain1Data(Domain1SearchBy searchBy,List<String> someList);並將@Deprecated註釋添加到前一個。

示例代碼:

@Deprecated 
static interface SearchBy { 
} 
static class Domain1SearchBy implements SearchBy { 
} 

static interface Api10 { 
    void some(SearchBy a); 
} 
static interface Api11 extends Api10 { 
    void some(Domain1SearchBy b); 
} 

static class Api10Impl implements Api10 { 
    @Deprecated 
    public void some(SearchBy a) { 
     System.out.println("some searchby"); 
    } 
} 
static class Api11Impl extends Api10Impl implements Api11 { 
    public void some(Domain1SearchBy b) { 
     System.out.println("some domain1"); 
    } 
} 

public static void main(String[] args) { 

    //with api 1.0 
    Api10 api10 = new Api10Impl(); 
    api10.some(new SearchBy() {}); 
    api10.some(new Domain1SearchBy()); 

    //with api 1.1 
    Api11 api11 = new Api11Impl(); 
    api11.some(new SearchBy() {}); 
    api11.some(new Domain1SearchBy()); 

} 

結果:

some searchby 
some searchby 
some searchby 
some domain1 
+0

我應該複製該方法並添加棄用的註釋嗎? –

+0

我確實相信。不過,這不是重複的。 –

+0

我相信@Deprecated標誌應該放在SearchBy和getDomain1Data(SearchBy searchBy,List someList);.然後添加不同參數的方法應該可以正常工作。從現在開始,每個新的應用程序都應該使用Domain1SearchBy,因此它將暗含getDomain1Data的使用(Domain1SearchBy searchBy,List someList);. –

0

如果您要改變正在使用的,因爲他們在這種情況下的方法,那麼我認爲正確的方法是添加新的方法和@Deprecated標記用的說明添加到老方法爲什麼它已被棄用,應該使用哪種方法。

0

你不能只是替換第二個第一個因爲客戶端可能會與SearchBy對象作爲參數acutual調用它。這會導致編譯錯誤。

有兩種方法也是不可能的,因爲他們是ambigous。如果用Domain1SearchBy對象調用,則兩種方法都適用,因此無法決定使用哪一個。

你只有兩種選擇都給予新的別稱或更改參數計數。

+0

downvoter可以解釋,所以我可以改善我的答案? –

+0

我相信'@ Deprecated'標誌應該放在'SearchBy'和'getDomain1Data(SearchBy searchBy,List someList);'中。然後添加不同參數的方法應該可以正常工作。從現在起,每個新的應用程序都應該使用'Domain1SearchBy',因此它將隱含使用'getDomain1Data(Domain1SearchBy searchBy,List someList);'。 –

+0

@Pisek你錯過了'Domain1SearchBy'是'SearchBy'的子類型。這就是通過'SearchBy'方法調用任何方法的原因。'@ Deprecated'註解不會改變這一點。如果使用帶註釋的成員,它只會生成一個編譯器警告。 –