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

com.gitee.l0km.aocache.Singleton Maven / Gradle / Ivy

There is a newer version: 0.4.5
Show newest version
package com.gitee.l0km.aocache;

import static com.gitee.l0km.aocache.AocacheUtils.invokeConstructor;
import static com.gitee.l0km.aocache.AocacheUtils.nonnullTypesOf;
import static com.gitee.l0km.aocache.AocacheUtils.EMPTY_CLASS_PARAMETERS;
import static com.gitee.l0km.aocache.guava.base.Preconditions.checkArgument;

import com.gitee.l0km.aocache.annotations.AoCacheable;
import com.gitee.l0km.aocache.annotations.AoWeakCacheable;
import com.gitee.l0km.aocache.guava.base.Throwables;

/**
 * 单实例缓存支持
 * @author guyadong
 *
 */
public class Singleton {

	/**
	 * 反射创建实例缓存 
	 * @param 
	 * @param clazz
	 * @param parameterTypes 构造方法参数类型数组
	 * @param args 构造方法参数对象数组
	 */
	private  T newInstance(Classclazz,Class[] parameterTypes, Object[]args)  {
		try {
			parameterTypes = null==parameterTypes
					? nonnullTypesOf(args) 
					: nonnullTypesOf(parameterTypes);
			args = (args == null) ? EMPTY_CLASS_PARAMETERS : args;
			checkArgument(parameterTypes.length == args.length,"MISMATCH parameterTypes.length and args.length");
			return (T) invokeConstructor(clazz,args, parameterTypes);
		} catch (Exception e) {
			Throwables.throwIfUnchecked(e);
			throw new RuntimeException(e);
		} 
	}
	/**
	 * 参见 {@link #newInstance(Class, Class[], Object[])},
	 * {@code args}数组不允许有{@code null}元素,
	 * 否则会因为无法获取参数类型抛出异常
	 */
	private  T newInstance(Classclazz,Object[] args)  {
		return newInstance(clazz,null,args);
	}
	/**
	 * 返回全局单实例(弱引用)
* 弱引用存储的实例在没有被引用时会被JVM自动回收,下次调用自动创建新实例 * @param 实例类型变量 * @param clazz 实例类型 * @param parameterTypes 构造方法参数类型数组 * @param args 构造方法参数对象数组 */ @AoWeakCacheable public T weakSingletonOf(Classclazz,Class[] parameterTypes,Object[]args) { return newInstance(clazz,parameterTypes,args); } /** * 返回全局单实例(弱引用)
* 弱引用存储的实例在没有被引用时会被JVM自动回收,下次调用自动创建新实例 * @param 实例类型变量 * @param clazz 实例类型 * @param args 构造方法参数,不允许有{@code null}元素,否则会因为无法获取参数类型抛出异常 */ @AoWeakCacheable public T weakSingletonOf(Classclazz,Object...args) { return newInstance(clazz,args); } /** * 返回全局单实例
* 运行时对给定输入参数返回同一实例 * @param 实例类型变量 * @param clazz 实例类型 * @param parameterTypes 构造方法参数类型数组 * @param args 构造方法参数对象数组 */ @AoCacheable public T singletonOf(Classclazz,Class[] parameterTypes,Object[]args) { return newInstance(clazz, parameterTypes, args); } /** * 返回全局单实例
* 运行时对给定输入参数返回同一实例 * @param 实例类型变量 * @param clazz 实例类型 * @param args 构造方法参数,不允许有{@code null}元素,否则会因为无法获取参数类型抛出异常 */ @AoCacheable public T singletonOf(Classclazz,Object...args) { return newInstance(clazz, args); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy