[英]why is overloading methods recommended over using the instanceof operator in java methods?
[英]Java: Using instanceof to expose different object methods
我已經閱讀了這篇文章http://www.javapractices.com/topic/TopicAction.do?Id=31 ,該文章說使用instanceof事先檢查我的對象是一個不好的做法。
但是在這種情況下,我不知道該怎么做:我有一個API,它返回一個項列表。 此項目列表返回用戶和管理員
如果我投放(User)item之類的項目,則當我點擊“ Admin”時就會收到ClassCastException
for(Item item : items){
if (item instanceof User){
((User)item).getName());
((User)item).getEmail());
}
else if (item instanceof Admin){
((Admin)item).getName());
((Admin)item).getEmailList().getPrimary());
}
}
由於它是API,因此我無法修改Item,Item在子項上沒有方法,並且電子郵件檢索方法也不同。 我還有其他選擇嗎?
用所有常用方法定義一個接口,讓User和Admin類在該接口上實現,在這種情況下,僅使用該接口訪問對象。
編輯(因為您不能更改API)
替代選項是:
堅持當前的解決方案。 這似乎是最好的交易。
定義一個接口,創建兩個實現該接口的包裝器類並包裝原始對象。 從OOP角度來看,這更干凈,但是我認為這在您的情況下有點過大,但這確實取決於。
理論(!):您也可以使用反射,但是不要這樣做-會使代碼更糟-尤其是當只有兩種不同的編譯時已知 Item子類型時
理想情況下,您應該將接口更改為Item,以便它公開方法,這樣與您在代碼中處理User或Admin無關緊要-以便Item定義getName()和getEmail()以及User和管理員根據需要實施這些方法。
但是,由於您無法控制正在使用的API,因此別無選擇,只能像現在一樣編寫代碼。
因此,所引用的文章提出的觀點很不錯,但是它假定您可以更改正在使用的類。
首先,您的代碼沒有任何作用。 您正在調用沒有任何分配的getter,因此實際上您沒有使用getter的返回值。
其次,使用不同類型的元素進行收集是一個不好的做法。 在您的ccase用戶和管理員中。
第三,如果您甚至需要此類集合,則可以使用其他模式來執行所需的操作。 例如,訪客模式看起來像是強制轉換的不錯選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.