All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.maxifier.mxcache.proxy.WeakProxyFactory Maven / Gradle / Ivy

/*
 * Copyright (c) 2008-2014 Maxifier Ltd. All Rights Reserved.
 */
package com.maxifier.mxcache.proxy;

import java.lang.ref.WeakReference;

/**
 * @author Alexander Kochurov ([email protected])
*/
public class WeakProxyFactory implements ProxyFactory {
    public static class WeakResolvable implements Resolvable {
        private static final Object NON_INITIALIZED = new Object();

        private final Resolvable resolvable;
        private WeakReference cached;

        public WeakResolvable(Resolvable resolvable) {
            this.resolvable = resolvable;
        }

        @Override
        public T getValue() {
            Object value = load();
            if (value == NON_INITIALIZED) {
                T t = resolvable.getValue();
                save(t);
                return t;
            }
            //noinspection unchecked
            return (T)value;
        }

        private synchronized Object load() {
            if (cached == null) {
                return NON_INITIALIZED;
            }
            T v = cached.get();
            if (v == null) {
                return NON_INITIALIZED;
            }
            return v;
        }

        private synchronized void save(T value) {
            cached = new WeakReference(value);
        }
    }

    @Override
    public Value proxy(Class expected, Resolvable resolvable) {
        //noinspection RedundantCast
        return (Value) MxProxyGenerator.getProxyFactory(expected, WeakResolvable.class).createProxy(new WeakResolvable(resolvable));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy