@Nullable
    public static TtlRunnable get(@Nullable Runnable runnable, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) {
        if (null == runnable) return null;

        if (runnable instanceof TtlEnhanced) {
            // avoid redundant decoration, and ensure idempotency
            if (idempotent) return (TtlRunnable) runnable;
            else throw new IllegalStateException("Already TtlRunnable!");
        }
        return new TtlRunnable(runnable, releaseTtlValueReferenceAfterRun);
    }
@ Nullable public static TtlRunnable get ( @ Nullable Runnable runnable , boolean releaseTtlValueReferenceAfterRun , boolean idempotent ) { if ( null == runnable ) return null ; if ( runnable instanceof TtlEnhanced ) { if ( idempotent ) return ( TtlRunnable ) runnable ; else throw new IllegalStateException ( "Already TtlRunnable!" ) ; } return new TtlRunnable ( runnable , releaseTtlValueReferenceAfterRun ) ; }
Factory method, wrap input {@link Runnable} to {@link TtlRunnable}.

@param runnable                         input {@link Runnable}. if input is {@code null}, return {@code null}.
@param releaseTtlValueReferenceAfterRun release TTL value reference after run, avoid memory leak even if {@link TtlRunnable} is referred.
@param idempotent                       is idempotent mode or not. if {@code true}, just return input {@link Runnable} when it's {@link TtlRunnable},
otherwise throw {@link IllegalStateException}.
<B><I>Caution</I></B>: {@code true} will cover up bugs! <b>DO NOT</b> set, only when you know why.
@return Wrapped {@link Runnable}
@throws IllegalStateException when input is {@link TtlRunnable} already and not idempotent.