簡體   English   中英

Java:使用instanceof公開不同的對象方法

[英]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)

替代選項是:

  1. 堅持當前的解決方案。 這似乎是最好的交易。

  2. 定義一個接口,創建兩個實現該接口的包裝器類並包裝原始對象。 從OOP角度來看,這更干凈,但是我認為這在您的情況下有點過大,但這確實取決於。

  3. 理論(!):您也可以使用反射,但是不要這樣做-會使代碼更糟-尤其是當只有兩種不同的編譯時已知 Item子類型時

理想情況下,您應該將接口更改為Item,以便它公開方法,這樣與您在代碼中處理User或Admin無關緊要-以便Item定義getName()和getEmail()以及User和管理員根據需要實施這些方法。

但是,由於您無法控制正在使用的API,因此別無選擇,只能像現在一樣編寫代碼。

因此,所引用的文章提出的觀點很不錯,但是它假定您可以更改正在使用的類。

首先,您的代碼沒有任何作用。 您正在調用沒有任何分配的getter,因此實際上您沒有使用getter的返回值。

其次,使用不同類型的元素進行收集是一個不好的做法。 在您的ccase用戶和管理員中。

第三,如果您甚至需要此類集合,則可以使用其他模式來執行所需的操作。 例如,訪客模式看起來像是強制轉換的不錯選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM