Java Generics类和构造函数

时间:2018-05-07 06:14:27

标签: java android generics constructor

我想创建用于执行GetInstance的父类。但我总是崩溃。 mInstance = new Instance<>();总是崩溃此行

public class Instance<T> {

    public Instance<T> mInstance;

    public Instance<T> GetInstance() {
        return mInstance;
    }

    public <T> Instance() {
        mInstance = new Instance<>();
    }
}


public class Timer extends Instance<Timer> {

}
  

java.lang.StackOverflowError的                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.familyfit.google.pushups.global.Instance。(Instance.java:21)                                                                                   在com.fami

3 个答案:

答案 0 :(得分:2)

你做错了

在构造函数中,您以递归方式调用自身,因此stackoverflow。

mInstance的初始化移到课外或使其静止。

试试这个:

public static class Instance<T> {

    private static final Instance<?> mInstance = new Instance<>();

    @SuppressWarnings("unchecked")
    public Instance<T> GetInstance() {
        // Make generic static instance. 
        // Strategy used similar to Collections.emptyList() implementation
        return (Instance<T>) mInstance;
    }

    private Instance() {

    }
}

答案 1 :(得分:2)

IntelliJ使用他的向导编写Singleton。

public final class Singleton{

private static final Singleton ourInstance = new Singleton();

public static Singleton getInstance() {
    return ourInstance;
}

/**
 * Private constructor
 */
private Singleton() {}
}

这样,单例只能创建一次。请注意私有构造函数,它不允许您创建更多实例,以及只有一个此类对象的static final实例。至少,public static Singleton getInstance方法会返回实例。请记住,在某些情况下,您会将单例类的其他方法声明为synchronized,但这取决于您的类的业务逻辑。

编辑:正如另一位用户建议的那样,最好将该类标记为最终类,以防止对单例逻辑进行不必要的修改。

答案 2 :(得分:0)

您有2个轻微错误,导致您的单身人士课程无效。首先,你的mInstance不是类的静态字段,这意味着类Instance的每个实例(严重选择名称TBH,使用更具体的东西)都会让它自己的mInstance失败整个目的,一个单一的实例。

其次,你有一个泛型类,遗憾的是在单例上下文中不能很好地工作。因为当你总是只有一个实例时,引入泛型是没有意义的。因为那样你就可以用T代替通用变量String或者你正在使用的类型。

要解决这些问题,您需要按以下方式更改课程:

public final class Instance {

     private static Instance mInstance;

     public static Instance getInstance(){
         if(mInstance == null){
             mInstance = new Instance();
         }
         return mInstance;
     }

     private Instance(){
         // your initialization logic
     }
}

我也做了一些正常的决定,例如制作类final,不要让第二个实例弹出,例如通过子类化。然后我也建立了构造函数和mInstnace字段private。要再次防止对类本身进行不必要的更改,并且不允许用户允许创建多个实例。