Java中的通用单例

时间:2016-09-03 11:43:01

标签: java generics singleton

为什么以下代码抛出 java.lang.InstantiationException:generics.SingletonFoo $ A

public class SingletonFoo {
    private static Object _tn;

    public static <T> T instance(Class<T> t) {
        if (_tn != null) {
            return (T) _tn;
        }
        try {
            _tn = t.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return (T) _tn;
    }


    private class A{
        public A() {
        }
    }

    public static void main(String[] args) {
        System.out.println(SingletonFoo.instance(A.class));
    }
}

它是否与某种类型的擦除有关,并且不可能在Java中创建通用单例?

1 个答案:

答案 0 :(得分:4)

这里A不是静态类。这意味着它包含对包含SingletonFoo(隐式)的引用,这意味着您可能无法通过newInstance实例化它。

尝试将其设置为静态,或者如果它不需要是内部类,则将其移出类。

解决方案1:使A成为静态成员类

private static class A{
        public A() {
        }
    }

Soution 2:外出

public class SingletonFoo {
    private static Object _tn;

    public static <T> T instance(Class<T> t) {
        if (_tn != null) {
            return (T) _tn;
        }
        try {
            _tn = t.newInstance();
            ;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return (T) _tn;
    }

    public static void main(String[] args) {
        System.out.println(SingletonFoo.instance(A.class));
    }

}

class A {
    public A() {
    }
}