我想创建用于执行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
答案 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
。要再次防止对类本身进行不必要的更改,并且不允许用户允许创建多个实例。