[英]Java Generics class and 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> {
}
com.familyfit.google.pushups.global.Instance。(Instance.java:21)處的com.familyfit.google.pushups.global.Instance。(Instance.java:21)處的java.lang.StackOverflowError。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的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。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的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。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)上com.familyfit.google.pushups.g的google.pushups.global.Instance。(Instance.java:21) com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的lobal.Instance。(Instance.java:21)。com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的lobal.Instance。(Instance.java:21) ),網址為com.familyfit.google.pushups.global.Instance。(Instance.java:21),網址為com.familyfit.google.pushups的com.familyfit.google.pushups.global.Instance。(Instance.java:21)。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的global.Instance。(Instance.java:21)。com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的global.Instance。(Instance.java:21) ),網址為com.familyfit.google.pushups.global.Instance。(Instance.java:21),網址為com.familyfit.google.pushups的com.familyfit.google.pushups.global.Instance。(Instance.java:21)。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的global.Instance。(Instance.java:21)。com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的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.push com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的ups.global.Instance。(Instance.java:21)com.familyfit.google.pushups.global.Instance。(Instance.java)上的ups.global.Instance。(Instance.java:21) :21),位於com.familyfit.google.pushups.global.Instance。(Instance.java:21),位於com.familyfit.google.pushups.global.Instance。(Instance.java:21),com.familyfit.google。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的com.familyfit.google.pushups.global.Instance。(Instance.java)上的pushups.global.Instance。(Instance.java:21) :21),位於com.familyfit.google.pushups.global.Instance。(Instance.java:21),位於com.familyfit.google.pushups.global.Instance。(Instance.java:21),com.familyfit.google。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的com.familyfit.google.pushups.global.Instance。(Instance.java)上的pushups.global.Instance。(Instance.java:21) :21),位於com.familyfit.google.pushups.global.Instance。(Instance.java:21),位於com.familyfit.google.pushups.global.Instance。(Instance.java:21),com.familyfit.google com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的.pushups.global.Instance。(Instance.java:21)。com.familyfit.google.pushups.global.Instance。(Instance。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)處的com.familyfit.google.pushups.global.Instance。(com.familyfit.google的com.familyfit.google.pushups.global.Instance。(Instance.java:21)的java.21) com.familyfit.google.pushups.global.Instance。(Instance.java:21)上的.pushups.global.Instance。(Instance.java:21)。com.familyfit.google.pushups.global.Instance。(Instance。 com.familyfit.google.pushups.global.Instance。(Instance.java:21)處的com.familyfit.google.pushups.global.Instance。(com.fami處Instance.java:21)的java.21
你這樣做是錯的
在構造函數中,您要遞歸調用自身,從而導致stackoverflow。
將mInstance
的初始化mInstance
類之外或使其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() {
}
}
這就是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
,但這取決於類的業務邏輯。
編輯:如另一個用戶建議的那樣,最好將類標記為final,以防止對單例邏輯進行不必要的修改。
您有2個小錯誤,這導致您的單例類無法正常工作。 首先,您的mInstance
不是類的靜態字段,這意味着Instance
類的每個實例( mInstance
選擇名稱TBH,使用更具體的名稱)都將擁有自己的mInstance
這會mInstance
整個單個實例的目的。
其次,您有一個通用類,可悲的是,它在單例環境中無法很好地工作。 因為當您始終只有一個實例時,引入泛型沒有任何意義。 因為這樣您就可以用String
或您使用的類型對通用變量T
進行硬編碼。
為了克服這些問題,您需要按以下方式更改課程:
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
字段mInstnace
private
。 為了再次防止類本身發生不必要的更改,並且不允許用戶創建多個實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.