class AbstractStore<K, O> extends InitializableObject implements Store<K, O> {

    /** {@inheritDoc} */
    @Override
    protected void internalInit(final boolean forceReinit) {
    }

    /** {@inheritDoc} */
    @Override
    public Optional<O> get(final K key) {
        CommonHelper.assertNotNull("key", key);
        init();

        return internalGet(key);
    }

    /** {@inheritDoc} */
    @Override
    public void set(final K key, final O value) {<FILL_FUNCTION_BODY>}

    /** {@inheritDoc} */
    @Override
    public void remove(final K key) {
        CommonHelper.assertNotNull("key", key);
        init();

        internalRemove(key);
    }

    /**
     * <p>internalGet.</p>
     *
     * @param key a K object
     * @return a {@link Optional} object
     */
    protected abstract Optional<O> internalGet(final K key);

    /**
     * <p>internalSet.</p>
     *
     * @param key a K object
     * @param value a O object
     */
    protected abstract void internalSet(final K key, final O value);

    /**
     * <p>internalRemove.</p>
     *
     * @param key a K object
     */
    protected abstract void internalRemove(final K key);
}

        CommonHelper.assertNotNull("key", key);
        init();

        if (value == null) {
            internalRemove(key);
        } else {
            internalSet(key, value);
        }
    
<methods>public non-sealed void <init>() ,public int getNbAttempts() ,public void init() ,public void init(boolean) ,public final boolean isInitialized() ,public void reinit() <variables>private java.util.concurrent.atomic.AtomicBoolean initialized,private volatile java.lang.Long lastAttempt,private int maxAttempts,private long minTimeIntervalBetweenAttemptsInMilliseconds,private java.util.concurrent.atomic.AtomicInteger nbAttempts