Вызов статического метода в конструкторе имеет проблему циклической зависимости? - PullRequest
0 голосов
/ 24 января 2019

Я вызываю статический метод класса A в конструкторе класса B. и получаю ExceptionInInitializerError.

Класс A и B оба являются одноэлементными.Я пытаюсь вызвать метод getAInstance () A в конструкторе B, но получил ошибку инициализатора, вызванную исключением нулевого указателя, вызывающим getAinstance ()

public class B{

//B's constructor
private B(){

String res = A.getAInstance().getString();//this line cause null pointer exception

// do something

}

//static method to get B's singleton instance
public static B getBInstance(){

}

Когда мне нужно вызвать B в классе C, я делаю что-то вроде B.getBInstance (). someMethodInB ().Тогда я не могу инициализировать B, потому что A.getAInstance () имеет исключение нулевого указателя.Так это круговая зависимость?Как это исправить?Я попытался использовать статический блок для инициализации, но все равно не получилось.

1 Ответ

0 голосов
/ 25 января 2019

Пример сценария согласно вашему объяснению

class A
{
    private static A a = new A();

    private A()
    {
    }

    public static A getInstance()
    {
        return a;
    }

    public void methodForA()
    {
        System.out.println("Method for A !!!!");
    }
}

class B
{
    private static B b = new B();

    private B()
    {
        A.getInstance().methodForA();
    }

    public static B getInstance()
    {
        return b;
    }

    public void methodForB()
    {
        System.out.println("Method for B !!!!");
    }
}

public class C
{
    public static void main(String[] args)
    {
        B.getInstance().methodForB();
    }
}

Выход: Метод А !!!! Метод Б !!!!

Пример для сценария с круговой зависимостью

class A
{
    private static A a = new A();

    private A()
    {
        B.getInstance().methodForB();
    }

    public static A getInstance()
    {
        return a;
    }

    public void methodForA()
    {
        System.out.println("Method for A !!!!");
    }
}

class B
{
    private static B b = new B();

    private B()
    {
        A.getInstance().methodForA();
    }

    public static B getInstance()
    {
        return b;
    }

    public void methodForB()
    {
        System.out.println("Method for B !!!!");
    }
}

public class C
{
    public static void main(String[] args)
    {
        B.getInstance().methodForB();
    }
}

Выход: Исключение в потоке "main" java.lang.ExceptionInInitializerError

...