![](/img/trans.png)
[英]Minecraft Forge - Cannot refer to an instance field while explicitly invoking a constructor
[英]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);
}
}
现在,由于您在Utils
有default
和overloaded
构造函数,这清楚地表明xPath
不是强制性的。
因此,一旦构建driver
,您就可以利用常规方法将其添加到driver
,因为添加xPath
完全在SelectRegisteredOwner
控制范围内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.