类中的循环依赖和StackOverflow错误

时间:2015-12-15 11:26:54

标签: java stack-overflow circular-dependency

虽然我一直遵循的做法可能不合适。仍在寻找我的问题的解决方案:

我收到了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();

问:我如何解决这种循环依赖关系以及我在这里做错了什么?细节会很棒。

编辑:我想要实现的细节是 - 我会在这两个类中有很多相互关联的方法。而不是在我想多次使用它的函数内部创建一个对象,我希望在另一个页面上有一个页面的单个对象来使用前者定义的方法。

1 个答案:

答案 0 :(得分:2)

您的问题是,当您创建HomePage时,它会创建新的LoginPage,每当您创建LoginPage时,您都会创建HomePage。这显然会导致永不停止(直到堆栈溢出)循环。

要解决此问题,请不要在构建期间创建页面。为他们制作setter

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);
}

或者,您可以通过引入一个新类来完全消除相互依赖性。

public class HomePage extends AppiumBasePage {

}

public class LoginPage extends AppiumBasePage {
}

class Pages {

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

这完全取决于你需要达到的目标。