繁体   English   中英

Java 继承:显式调用构造函数时不能引用实例字段

[英]Java inheritance: Cannot refer to an instance field while explicitly invoking a constructor

鉴于我有一个类的层次结构。 父类如下:

public class Utils {

    protected Driver driver;

    public Utils() {
        this.driver = new Driver();
    }

    public Utils(Driver driver,String xPath) {
        this.driver = driver;
        this.driver.waitForElement(xPath, 2);
    }

而孩子是:

public class SelectRegisteredOwner extends Utils {


    final String newOrUsed = "//*[@id=\"root\"]/div/div[3]/div/div[2]/div/div/form/div[3]/div[2]/button[2]";


    public SelectRegisteredOwner( Driver driver) {
        super(driver,newOrUsed);
    }}

问题是,在super(driver,newOrUsed);行中的子类中super(driver,newOrUsed); 它抱怨:

Cannot refer to an instance field newOrUsed while explicitly invoking a constructor

作为快速修复,建议将newOrUsed视为static属性

有没有办法在不使属性静态的情况下解决这个问题?

在类初始化之前,您不能使用最终字段newOrUsed 将其设为静态或将其移动到构造函数中。

该字段看起来像一个常量,允许您识别 UI 中的元素。 我会将其设为常量并将其与您的子类分开:

public class Utils {

    private Driver driver;  //make them private and expose getters
    private String xPath;

    public Utils() {
        this.driver = new Driver();
    }

    public Utils(Driver driver,String xPath) {
        this.driver = driver;
        this.xPath = xPath;
        this.driver.waitForElement(xPath, 2);
    }
   protected Driver getDriver(){...}
   protected Driver getXPath(){...}
}

public class SelectRegisteredOwner extends Utils {
    public SelectRegisteredOwner( Driver driver) {
        super(driver,XPathSelector.NEW_OR_USED);
    }
}

public interface XPathSelector{
    String NEW_OR_USED = "//*[@id=\"root\"]/div/div[3]/div/div[2]/div/div/form/div[3]/div[2]/button[2]";
}

由于该字段具有恒定值,因此您可以将其设为static 但由于您的要求不是使用static ,我推荐这种方法

class Utils {

    protected Driver driver;

    public Utils() {
        this(new Driver());
    }

    public Utils(Driver driver) {
        this.driver = driver;
    }

    public void addXPath(String xPath) {
        this.driver.waitForElement(xPath, 2);
    }
}

class SelectRegisteredOwner extends Utils {

    final String newOrUsed = "//*[@id=\"root\"]/div/div[3]/div/div[2]/div/div/form/div[3]/div[2]/button[2]";

    public SelectRegisteredOwner(Driver driver) {
        super(driver);
        addXPath(newOrUsed);
    }
}

现在,由于您在Utilsdefaultoverloaded构造函数,这清楚地表明xPath不是强制性的。

因此,一旦构建driver ,您就可以利用常规方法将其添加到driver ,因为添加xPath完全在SelectRegisteredOwner控制范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM