2016-04-24 38 views
0

我很清楚反射應該只能作爲最後的手段,即使您處於似乎您應該依賴的情況下,也可能意味着您的設計不好。這是一個非常強大的工具,只能極其謹慎地使用在Java中使用Object.getClass()是不好的做法嗎?

我也知道,的Java存儲一些家政信息有關對象,所以理論上它應該是一個相對便宜的操作以確定動態類型的對象與Object.getClass()(至少便宜相比,沒有這樣的語言管家數據,例如C++,其中RTTI需要昂貴的vtable查找)。

這是真的嗎? 難道認爲實踐中的Java 檢查一個objec一些基本的噸一定使用getClass()派生

回答

1

檢查被認爲是不好的做法,在個案對象的運行時類型時,儘量選擇基於該類型行爲:

if (animal instanceof Cat) { // or animal.getClass() == Cat.class 
    ((Cat) animal).meow(); 
} else if (animal instanceof Dog) { 
    ((Dog) animal).woof(); 
} 

如果你這樣做,你會忽略多態性,因爲它告訴我們這樣做:

animal.makeSound(); 

但是可以有很多當您需要知道對象類型時,請使用.getClass()instanceof - 使用反射,使用第三方庫等。如果您沒有黑客入侵多態,那就沒問題。

0

檢查對象的類型並不是一個壞習慣。但是,Java中的反思仍然被認爲是一項昂貴的操作。

代替使用getClass()來確定類型,最好使用instanceof來檢查類型是否與您正在查找的內容匹配。

例如:

if(theObject instanceof SomeBaseClassObject){ 
    //do something 
} 
+1

'instanceof'對於派生自類SomeBaseClassObject''的類的實例返回'true',所以它不一樣。 – Martin

+0

正確,但您會用它來檢查您關心的父級/子級別中的級別。如果你想驗證它是一個子對象,那麼instanceof就是這個。您可以根據需要縮小範圍。 – pczeus

+0

正確,但可以使用'getClass()'來檢查一個實例是否是查找類型的_exactly_。 – Martin

1

我會說這完全取決於情況,但大多數情況下,我見過,都是不好的做法。因爲它通常用於正確設計的替代品。

一種不好的做法使用getClass的例子情況是這樣的:

public void method(SomeObject obj) { 
    if(obj.getClass() == A.class) { 
     // do something for A 
    } 
    if(obj.getClass() == B.class) { 
     // do something for B 
    } 
    ... 
} 

爲什麼不委託obj

obj.doSomething(); 

或分割的情況下通過重載方法:

public void method(A obj){...} 
public void method(B obj){...} 

問題是,它可以避免很多的時間,這通常表明您在運行時正在進行工作,而這可以在編譯時完成。

相關問題