2017-02-17 42 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更新此消息。 –

相关问题