/*
 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package javafx.collections;

import javafx.beans.NamedArg;
import javafx.beans.WeakListener;

import java.lang.ref.WeakReference;

A WeakSetChangeListener can be used, if an ObservableSet should only maintain a weak reference to the listener. This helps to avoid memory leaks, that can occur if observers are not unregistered from observed objects after use.

WeakSetChangeListener are created by passing in the original SetChangeListener. The WeakSetChangeListener should then be registered to listen for changes of the observed object.

Note: You have to keep a reference to the SetChangeListener, that was passed in as long as it is in use, otherwise it will be garbage collected to soon.

Type parameters:
  • <E> – The type of the observed value
See Also:
Since:JavaFX 2.1
/** * A {@code WeakSetChangeListener} can be used, if an {@link javafx.collections.ObservableSet} * should only maintain a weak reference to the listener. This helps to avoid * memory leaks, that can occur if observers are not unregistered from observed * objects after use. * <p> * {@code WeakSetChangeListener} are created by passing in the original * {@link SetChangeListener}. The {@code WeakSetChangeListener} should then be * registered to listen for changes of the observed object. * <p> * Note: You have to keep a reference to the {@code SetChangeListener}, that * was passed in as long as it is in use, otherwise it will be garbage collected * to soon. * * @see SetChangeListener * @see ObservableSet * @see javafx.beans.WeakListener * * @param <E> * The type of the observed value * * @since JavaFX 2.1 */
public final class WeakSetChangeListener<E> implements SetChangeListener<E>, WeakListener { private final WeakReference<SetChangeListener<E>> ref;
The constructor of WeakSetChangeListener.
Params:
  • listener – The original listener that should be notified
/** * The constructor of {@code WeakSetChangeListener}. * * @param listener * The original listener that should be notified */
public WeakSetChangeListener(@NamedArg("listener") SetChangeListener<E> listener) { if (listener == null) { throw new NullPointerException("Listener must be specified."); } this.ref = new WeakReference<SetChangeListener<E>>(listener); }
{@inheritDoc}
/** * {@inheritDoc} */
@Override public boolean wasGarbageCollected() { return (ref.get() == null); }
{@inheritDoc}
/** * {@inheritDoc} */
@Override public void onChanged(Change<? extends E> change) { final SetChangeListener<E> listener = ref.get(); if (listener != null) { listener.onChanged(change); } else { // The weakly reference listener has been garbage collected, // so this WeakListener will now unhook itself from the // source bean change.getSet().removeListener(this); } } }