下面是一些代碼,我已經寫在一個通用的方式來處理事件,其應僅用於任何JavaFX的事件觸發一次:在這段代碼中AtomicBoolean矯枉過正?
public final class OneShotEvent<T extends Event>
implements EventHandler<T>
{
private final AtomicBoolean triggered = new AtomicBoolean(false);
private final EventHandler<T> delegate;
public static <E extends Event> EventHandler<E> of(final EventHandler<E> delegate)
{
return new OneShotEvent<>(delegate);
}
private OneShotEvent(final EventHandler<T> delegate)
{
this.delegate = Objects.requireNonNull(delegate);
}
@Override
public void handle(final T event)
{
if (!triggered.getAndSet(true))
delegate.handle(event);
}
}
出於某種原因,我做了triggered
一個AtomicBoolean
,而不是一個簡單的boolean
。
想過之後,我認爲這太過矯治了,因爲事件處理程序會在JavaFX的「平臺線程」上運行......或者它們不會? 因爲如果是這種情況,那麼一個簡單的布爾值就足夠了......對嗎?
在多線程環境中,這將是一個體面的模式使用。在單線程環境中確實是一個矯枉過正的問題,但你應該擺脫它的原因不是性能,而是代碼複雜性。 – biziclop
@biziclop我同意。我現在只是沒有足夠的信心,因爲我對JavaFX的瞭解最多隻有一個簡單的布爾值「足夠安全」:( – fge