2017-02-17 44 views
2

在Android Studio中,下面的代碼有顏色,以指示「隱匿名類參數」變量commandBytes在這種情況下,「隱式匿名類參數」是什麼意思?

public boolean writeCommand(byte[] commandBytes) { 
if(writeCommandInProgress.compareAndSet(false, true)) { 
    writeSubscription = bleDevice 
      .establishConnection(asBleServiceRef, false) 
      .flatMap(rxBleConnection -> rxBleConnection.writeCharacteristic(asInputCharId, commandBytes)) 
      .subscribe( 
        characteristicValue -> { 
         writeCommandInProgress.set(false); 
         if(!Arrays.equals(characteristicValue, commandBytes)) 
          Log.d(LOG_TAG, "Data read back from writeCommand() doesn't match input"); 
        }, 
        throwable -> Log.d(LOG_TAG, "Error in writeCommand: " + commandBytes.toString() + "; " + throwable.getMessage()) 
      ); 
    return true; 
    } else return false; 
} 

我想不通這是什麼意思。對JetBrains的幫助網站的描述並不真正有幫助:「這是一個局部變量,由方法內部的匿名或本地類使用,因此成爲匿名類的一個字段。」這如何適用?這是我需要擔心的事嗎?

+0

我很好奇,Google'd,我看到你是互聯網上唯一一個詢問這個問題的人:-)對它的解釋似乎很明顯,但不清楚它的含義可能是什麼。一對夫婦猜測:也許只是讓你知道它會保存一個參考,所以可能不會GC'd?爲了警告潛在的多線程問題? –

+0

另一方面,如果這是產品代碼,誰必須維護它,誰會恨你。沒有人能夠看到這一點,並確定它在不花費大量時間的情況下做了什麼。 –

+0

實際上不是生產代碼,而是來自RxAndroidBle庫的作者的稍微改編的片段,用於測試目的。至於說明是顯而易見的,請幫助我指出匿名類,該變量是一個隱含參數? –

回答

3

着色表示參數或局部變量是在外部聲明的,並在匿名類(或本例中爲lambda)內部使用。爲了使這成爲可能,javac編譯器將在匿名類中創建一個合成字段來存儲變量。您可以通過檢查字節碼(View > Show Bytecode)來查看該字段。

這不是一個值得擔心的事情,它不是一個警告,它只是提供信息的語法着色。它確實意味着變量是隱含的或明確的最終的,所以不可能在不破壞編譯的情況下重新分配它。

+0

啊,我沒有把「匿名班」和「lambda」聯繫起來。也許JetBrains應該考慮爲Java 8更新此消息。 –

相關問題