Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java在子类中强制执行和使用静态变量_Java_Design Patterns - Fatal编程技术网

使用Java在子类中强制执行和使用静态变量

使用Java在子类中强制执行和使用静态变量,java,design-patterns,Java,Design Patterns,我想在超类静态方法中使用来自子类的静态变量。似乎我无法确保变量存在,因为它是静态的,我无法以这种方式强制执行静态成员 实际上,我希望在功能上与此类似: protected class Page { static WebDriver driver = new ChromeWebDriver(); public static boolean onPage () { return driver.findElements(By.id(PAGE_NAME)) != null

我想在超类静态方法中使用来自子类的静态变量。似乎我无法确保变量存在,因为它是静态的,我无法以这种方式强制执行静态成员

实际上,我希望在功能上与此类似:

protected class Page {
    static WebDriver driver = new ChromeWebDriver();
    public static boolean onPage () {
        return driver.findElements(By.id(PAGE_NAME)) != null;
    }
}

public class HomePage extends Page {
    static String PAGE_NAME = "home";
}

public class LoginPage extends Page {
    static String PAGE_NAME = "login";
}

...
HomePage.onPage();
...
对于这样的事情,最好的模式是什么

注:主要要求如下:

  • onPage()保持静态并
  • onPage()不接受任何参数

    • 你不能按原样去做。但是,在基类中有一个最终字段,并强制每个驱动类向超级构造函数提供一个参数,如下所示

      public abstract class Page {
      
          final String pageName;
      
          public Page(String title) {
              pageName = title;
          }
         //the rest implementation
      }
      
      然后你可以有你的网页像

      public class HomePage extends Page
       {
      
          public HomePage()
            {
             super("home");
            } 
        }
      

      另一种选择是在基页中提供抽象getPageName,并在驱动类中实现它

      您应该问自己的问题:为什么要这样做?换句话说:为什么这比返回页面名称的非静态抽象方法更好?在您的示例中,调用
      Page.onPage()
      如何告诉您在哪个页面上?这在Java中是不可能做到的。注意:无论如何,您不能像这样访问
      驱动程序。@KyleShrader根本不使用static。静态和继承是无神论。没有状态并不意味着使用静态。(使用static也不意味着缺少状态)。不幸的是,到目前为止,我必须保证页面是静态的(@KyleShrader这并没有让不可能成为可能。@KyleShrader祝你好运。