簡體   English   中英

instanceof operator java的復雜性

[英]complexity of instanceof operator java

我想知道在java中使用instanceof運算符的計算成本是多么昂貴,並想知道是否有更好的替代方案可用

另一種方法是避免使用instanceof並正確設計你的類(在OO意義上)。

由於instanceof運算符具有相應的“ instanceof ”字節代碼指令,因此可能不會有更高效的方法; 但這也可能取決於實際JVM的優化方式。

instanceof非常快。 然而,它通常是一個經過深思熟慮的設計的症狀。

它與(成功)演員表演的表現大致相同,因為它做了很多相同的事情。 實際上,該任務大致相當於“虛擬”方法調用。

在理智的實現上:對於類,只需要獲取運行時類並查看固定的偏移量來檢查超類(只要你沒有超過8個類的HotSpot繼承鏈)。 接口有點棘手,但通常最后兩個用例適用於緩存的任何特定運行時類。 所以這也很快。

如果你想檢查對象是否是某個類的實例(但是如果它extendsimplements它,則不是),也許將這些類與==進行比較會更快:

o.getClass() == YourClass.class

否則,因為為特定目的創建了instanceof關鍵字,我不知道你怎么能做得更好..

我假設您實際上已經對您的代碼進行了分析,並發現您對instanceof的使用是一個非常重要的性能影響? 如果沒有,你幾乎肯定會解決一個不值得你花時間去解決的問題。

如果你所做的只是這樣的代碼:

if ( something instanceof MyClass ) {
    MyClass mySomething = (MyClass) something;
    //...
} else {
    //exceptional case
}

然后可能首先嘗試ClassCastException轉換,並允許ClassCastException成為您的“例外情況”:

try {
   MyClass mySomething = (MyClass) something;
} catch (ClassCastException cce) {
    //exceptional case
}

現在,雖然可能是過早優化 ,但重新考慮您的設計還為時過早。 過度使用instanceof是一種設計氣味。 通常,您應該使用泛型和多態,以減少使用instanceof (實際上是cast)到(幾乎)為零的次數。

  1. 如果應根據對象的類型運行不同的代碼,請考慮使該代碼成為對象的實例方法,並使不同的類型符合接口。

  2. 如果你發現自己“知道”一個對象屬於某種類型,但是你已經做了一些讓編譯器忘記了這一事實的步驟(例如你將它放入原始List ),那么它可能是一個泛化的候選者。

暫無
暫無

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

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