Circular Dependency in classes and StackOverflow Error

☆樱花仙子☆ 提交于 2021-02-04 08:41:11

问题


Though the practice that I have been following could be inappropriate. Still looking for a fix to my problem here :

I'm getting a StackOverflowError ::

java.lang.StackOverflowError
    at com.my.package.pages.Selendroid.HomePage.<init>(HomePage.java:11)
    at com.my.package.pages.Selendroid.LoginPage.<init>(LoginPage.java:14)
    at com.my.package.pages.Selendroid.HomePage.<init>(HomePage.java:11)

AppiumBasePage ::

public class AppiumBasePage {
    protected AppiumDriver driver;

HomePage ::

public class HomePage extends AppiumBasePage {
    LoginPage loginPage = new LoginPage();

LoginPage ::

public class LoginPage extends AppiumBasePage {
    HomePage homePage = new HomePage();

Q : How do I resolve this cyclic dependency and what exactly am I doing wrong here? Details would be great.

Edit : The details to what I want to achieve is - I would be having a lot of interrelated methods in both these classes. And instead of creating an object inside the functions where I wanted to use it multiple times, I want to have a single object of one page on another to use the methods defined in the former.


回答1:


Your problem is that when you create a HomePage it creates a new LoginPage and whenever you create a LoginPage you create a HomePage. This will clearly result in a never ending (until the stack overflows) cycle.

To solve the problem, do not create the pages during construction. Make setters for them

private static class AppiumBasePage {

    public AppiumBasePage() {
    }
}

public class HomePage extends AppiumBasePage {

    LoginPage loginPage;

    public void setLoginPage(LoginPage loginPage) {
        this.loginPage = loginPage;
    }

}

public class LoginPage extends AppiumBasePage {

    HomePage homePage;

    public void setHomePage(HomePage homePage) {
        this.homePage = homePage;
    }


}

public void test() {
    LoginPage login = new LoginPage();
    HomePage home = new HomePage();
    login.setHomePage(home);
    home.setLoginPage(login);
}

Alternatively you could remove the interdependency entirely by introducing a new class to maintain that.

public class HomePage extends AppiumBasePage {

}

public class LoginPage extends AppiumBasePage {
}

class Pages {

    AppiumBasePage login = new LoginPage();
    AppiumBasePage home = new HomePage();
}

It all depends on what you need to achieve.



来源:https://stackoverflow.com/questions/34288021/circular-dependency-in-classes-and-stackoverflow-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!