2016-08-24 74 views
1

所以,假設我有兩個幾乎相同的類,但它們表示具有關鍵差異的對象。目前,這些差異並沒有真正落實。例如,我們將其稱爲MorningShiftWorker的一個類與另一個類具有完全相同的方法和構造方法,我們將其稱爲EveningShiftWorker。這兩個對象都存儲在超類型ShiftWorker的列表中。Java的instanceof可以區分功能相同的類嗎?

從邏輯上講,分離這兩個組合是有意義的,但不是將其他變量添加到組合中,我想我只是使用instanceof檢查ShiftWorker列表中的對象。

我的問題是:instanceof智能足以區分蘋果和橘子?目前這兩個類目前除了名稱完全相同外,這足以讓instanceof將他們分開,還是有另一種方法可以解決這個問題?

+0

你爲什麼不簡單地嘗試呢? – Manu

+0

它們是在兩個單獨的類文件中定義的,它們都不是從另一個類文件繼承的,因此一個不是另一個的實例 – user902383

+0

這聽起來像是會遇到一些嚴重的建模問題。如果您的域模型構建正確,則幾乎不需要使用'instanceof'。 – chrylis

回答

3

是的,instanceof本質上是檢查對象是否可以正確地轉換到給定的類。假設我們有這些類:

public class Fruit {} 
public class Orange extends Fruit {} 
public class Apple extends Fruit {} 

然後在一些方法中,我們嘗試:

Fruit f = new Apple(); 
boolean isOrange = f instanceof Orange; //False 

這也適用於空/非功能性接口。

+0

我聽說使用instanceof也是糟糕的代碼設計。我還應該研究其他方法嗎?另外,謝謝!我應該只是測試一下,但這是一個有壓力的一週,今天我還沒有很好的控球! – TheFunk

+0

@TheFunk看看[訪問者模式](http://www.tutorialspoint.com/design_pattern/visitor_pattern.htm),但在你的例子中說你有一個calcPay(),它可以在基類中以不同的方式實現從你的列表中多態地稱它爲訪問者或instanceof不需要 – PSD

+0

@TheFunk'instanceof'本身並不意味着不好的設計。我的感覺是糟糕的設計是程序員根據使用'instanceof'的能力來設計他們的邏輯。有很多OOP範例(例如過載)和設計模式(例如解釋器,外觀),它們可以更清楚地克服「這個引用指向的究竟是什麼類型的對象」的問題。本質上:不要害怕使用它,但也不要指望使用它。 – Zircon

0

是的instanceof是足夠「智能」,因爲Java使用名稱區分對象/類不屬於結構

3

instanceof操作比不上類的內容。它非常清楚x是否爲y的實例,即使xy是除名稱外的相同類。

只檢查第一個參數是否是第二個參數的繼承層次,即一切都是instanceof ObjectIntegerFloat和它的朋友是對所有對象yxinstanceof Number,當然x instanceof y的。

+0

「'x instanceof x'」這對任何'x'都沒有意義。如果'x'是一個值,它不能是'instanceof'的權利;如果它是一種類型,它不能在左邊。 –

2

你在問錯誤的問題。你應該問:「我如何修復我的破碎設計」。

如果您必須使用「幾乎」相同的類,但在其方法和構造函數中共享「重複」代碼;那麼你正在做點什麼錯了

從來沒有重複的代碼。

所以,不要擔心instanceof;你應該退後一步並重新設計你的班級層次結構,以找到如何最終實現通用常見問題;所以你的早晚換檔只包含「那些不同的方面」。

你可能想看看Robert Martin的「敏捷原理」。這本書在「支付系統」中包含了一個很好的現實世界的例子。並詳細解釋瞭如何創建一個系統,讓員工在不同的模型中獲得報酬,而不需要在所有地方重複。 (你甚至可以在因特網上免費找到「C#」版本爲PDF格式)。

+0

謝謝。目前這些類在功能上是相同的,但實際上它們不包含通用代碼。在與@PSD交談時,我想起了多態。如果我讓我的超類具有抽象方法,我可以在我的子類中定義它們,但是在不使用instanceof的情況下在超類上調用它們! :D – TheFunk

+0

是的,事情應該是這樣。 – GhostCat

相關問題