Я хочу зарегистрировать JavaFX ListChangeListener
на ObservableList
. Однако я заметил, что при определенных обстоятельствах слушателя не звонят.Как правильно создать слабую ссылку на ссылку на метод в Java
(1) Если прослушиватель эталонный метод, все работает:
// using a direct method reference:
private final ListChangeListener<String> listener = this::listDidChange;
/* ... */
public void init() {
list.addListener(listener);
}
(2) Однако, если прослушиватель слабый реф к тому же методу, что слушатель не вызывается :
// using a weak method reference:
private final ListChangeListener<String> listener = new WeakListChangeListener<String>(this::listDidChange);
/* ... */
public void init() {
list.addListener(listener);
}
(3) Теперь действительно забавное в том, что это снова работает, даже если она должна быть такой же, как Previou s пример:
// direct method reference wrapped into a weak ref later:
private final ListChangeListener<String> listener = this::listDidChange;
/* ... */
public void init() {
list.addListener(new WeakListChangeListener<String>(listener));
}
Два вопроса:
- Что именно происходит, когда слабая ссылку на метод исй создаются?
- В чем разница между (2) и (3)?
В соответствии с JavaDoc для WeakListChangeListener: «Примечание. Необходимо сохранить ссылку на ListChangeListener, которая была передана до тех пор, пока она используется, иначе в скором времени будет собран мусор». – neuronaut