Класс и конструктор Java Generics - PullRequest
0 голосов
/ 07 мая 2018

Я хочу создать родительский класс для выполнения 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 голосов
/ 07 мая 2018

Так IntelliJ пишет синглтон с помощью своего мастера.

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 возвращает вам экземпляр. Помните, что в некоторых случаях вы могли бы объявить другие методы класса singleton как synchronized, но это зависит от бизнес-логики вашего класса.

Редактировать: как предложил другой пользователь, лучше пометить как финальный класс, чтобы предотвратить нежелательное изменение одноэлементной логики.

0 голосов
/ 07 мая 2018

У вас есть 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. Чтобы не допустить повторения нежелательных изменений в самом классе, и не позволяя пользователю разрешить создавать более одного экземпляра.

0 голосов
/ 07 мая 2018

Вы делаете это неправильно

В вашем конструкторе вы вызываете себя рекурсивно, следовательно, 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() {

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...