簡體   English   中英

Java泛型類和構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM