2017-02-17 10 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

Цвет указывает, что параметр или локальная переменная объявляется снаружи и используется внутри анонимного класса (или лямбда в этом случае). Чтобы сделать это возможным, javac-компилятор создаст синтетическое поле в анонимном классе для хранения переменной. Вы можете увидеть это, проверив байт-код (View > Show Bytecode).

Это не о чем беспокоиться, это не предупреждение, это просто раскраска синтаксиса для предоставления информации. Это означает, что переменная неявно или явно окончательна, поэтому ее невозможно переназначить, не нарушая компиляцию.

+0

А, мне не удалось установить связь между «анонимным классом» и «лямбдой». Возможно, JetBrains должен рассмотреть возможность обновления этого сообщения для Java 8. –