How can I implement an abstract singleton class in Java?

前端 未结 6 447
日久生厌
日久生厌 2020-12-15 16:48

Here is my sample abstract singleton class:

public abstract class A {
    protected static A instance;
    public static A getInstance() {
        return ins         


        
6条回答
  •  半阙折子戏
    2020-12-15 17:45

    I found a better way to use Singleton in abstract class, which use a static Map to maintain the instance of subclass.

    public abstract class AbstractSingleton {
    
        private static Map registryMap = new HashMap();
    
        AbstractSingleton() throws SingletonException {
            String clazzName = this.getClass().getName();
            if (registryMap.containsKey(clazzName)) {
                throw new SingletonException("Cannot construct instance for class " + clazzName + ", since an instance already exists!");
            } else {
                synchronized (registryMap) {
                    if (registryMap.containsKey(clazzName)) {
                        throw new SingletonException("Cannot construct instance for class " + clazzName + ", since an instance already exists!");
                    } else {
                        registryMap.put(clazzName, this);
                    }
                }
            }
        }
    
        @SuppressWarnings("unchecked")
        public static  T getInstance(final Class clazz) throws InstantiationException, IllegalAccessException {
            String clazzName = clazz.getName();
            if (!registryMap.containsKey(clazzName)) {
                synchronized (registryMap) {
                    if (!registryMap.containsKey(clazzName)) {
                        T instance = clazz.newInstance();
                        return instance;
                    }
                }
            }
            return (T) registryMap.get(clazzName);
        }
    
        public static AbstractSingleton getInstance(final String clazzName)
                throws ClassNotFoundException, InstantiationException, IllegalAccessException {
            if (!registryMap.containsKey(clazzName)) {
                Class clazz = Class.forName(clazzName).asSubclass(AbstractSingleton.class);
                synchronized (registryMap) {
                    if (!registryMap.containsKey(clazzName)) {
                        AbstractSingleton instance = clazz.newInstance();
                        return instance;
                    }
                }
            }
            return registryMap.get(clazzName);
        }
    
        @SuppressWarnings("unchecked")
        public static  T getInstance(final Class clazz, Class[] parameterTypes, Object[] initargs)
                throws SecurityException, NoSuchMethodException, IllegalArgumentException,
                InvocationTargetException, InstantiationException, IllegalAccessException {
            String clazzName = clazz.getName();
            if (!registryMap.containsKey(clazzName)) {
                synchronized (registryMap) {
                    if (!registryMap.containsKey(clazzName)) {
                        Constructor constructor = clazz.getConstructor(parameterTypes);
                        T instance = constructor.newInstance(initargs);
                        return instance;
                    }
                }
            }
            return (T) registryMap.get(clazzName);
        }
    
        static class SingletonException extends Exception {
            private static final long serialVersionUID = -8633183690442262445L;
    
            private SingletonException(String message) {
                super(message);
            }
        }
    }
    

    From: https://www.cnblogs.com/wang9192/p/3975748.html

提交回复
热议问题