Java:如何为变量自动生成一个自定义方法

6

我有一个情况,我想为我的字段定义各种行为。

class SomePage {
    //...

    @FindBy(id = "selectEthinicity")
    private WebElement ethinicitySelect;

    @FindBy(id = "someId")
    private WebElement usernameInputField;

     @FindBy(id = "buttonSubmit")
    private WebElement submitButton;


    public void selectEthnicity(String param) throws Exception {
        new Select(ethnicitySelect).selectByVisibleText(param);
    }

    public void selectEthnicityByIndex(String param) throws Exception {
        new Select(ethnicitySelect).selectByIndex(Integer.parseInt(param));
    }

    public int getSelectEthinicityNumberOfOptions() {
        new Select(ethnicitySelect).getOptions().size();    
    }

    public void waitForOptionOfSelectEthnicityToLoad() {
       //logic to wait for an options of Ethinicity to load
    }

    public void selectEthnicity_Wait(String param) throws Exception {
        //wait 
        //select Ethinicity
    }

    public void selectEthnicityByIndex_Wait(String param) throws Exception {
       //wait and 
       //Select Ethnicity by einde
    }


    //custom method for input Field
    public String getUsernameInputFieldValue() {
        usernameInputField.getAttribute("value");
    }

    public void enterUsernameInputField(String param) {
        usernameInputField.sendKeys(param);
    }


    //custom method for button
    public void clickSubmitButton() throws PageValidationException {
        submitButton.click();
    }

    //...
}

我有一个名为SomePage的类,它是一个页面对象(使用Page Factory模式),其中包含字段(WebElement)。

根据字段名称的后缀,我需要创建一些方法。如果后缀是*Select,则该字段将具有许多方法,这些方法可以适用于所有select字段。如果后缀是*Button,则它将具有button字段所需的方法。

我能否根据字段名称的后缀生成自定义方法?

注意:IntelliJ支持修改自定义Getter和Setter,但不允许每个字段有多个方法。它限制每个字段只有一个Getter和一个Setter。但实际情况并非总是如此,例如我的某些字段可能需要多个setter或getter。


你可能想要查看Project Lombok - Markus W Mahlberg
你不能创建一个具有定义函数的Radio/Button类的原因是什么?你甚至可以使用超类并扩展它,然后在Temp类中只使用各个按钮/电台的getter和setter方法,并调用其getter/setter方法。 - Compass
我已经更新了示例,接近于我正在使用的内容。WebElement 已经具有我需要的功能。但是我正在使用所谓的 PageObject 模式,因此我需要每个元素(变量)在页面中都有这些方法。 - A0__oN
3个回答

0

可以生成自定义类,但动态类生成是一项相当高级的功能,从您的问题听起来,这是不必要的复杂性。

我认为您应该为这些对象创建一个新类,并具有相同的功能。您应该阅读面向对象编程的相关知识,因为这是一个相当简单的概念。也许您的示例很差,但为什么要为每个按钮重新定义字符串函数?以下是不同设计的示例:

public class Button {
    private String text;

    public Button(String text) {
        this.text = text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

然后只需声明一堆你的新类。

class Temp {
    Button abcButton = new Button("abc");
    Button cdeButton = new Button("cde");

        // Instead of setAbcButtonToLower()
        abcButton.setText(abcButton.getText().toLowerCase());
        // Instead of getAbcButtonIndexOfChar()
        abcButton.getText().indexOf(c);
        // Instead of getAbcButtonSize()
        abcButton.getText().length();
}

我添加的代码只是一个示例代码... 我实际上并没有对字符串执行那些操作... 我只是想以简单的方式向您展示我需要什么... 您能否请再次查看我的问题,忽略我的变量作为字符串... 我只想要自定义方法来描述这些变量的行为。 - A0__oN
我认为我的答案仍然适用。创建一个类,并在其中定义所有常见操作。 - Samuel
使用超类和子类是我的方法,而不是为每个对象定制特定的方法。如果每个对象都使用完全相同的方法,则应在对象级别应用这些方法。 - Compass
@Compass 如果我使用继承方法,我将不得不传递一个元素来执行操作。你的方法很好...那就是我一直在做的,但这不是我要寻找的解决方案... - A0__oN
@Samuel,我已经更新了示例,请您再次查看并让我知道您是否理解我想要实现的内容。 - A0__oN

0

在 IntelliJ IDEA 中生成 Getter 和 Setter:

  1. 在主菜单中选择 Code。或者,右键单击编辑器并选择上下文菜单中的 Generate,或使用 Alt+Insert 快捷键。
  2. 在编辑器中显示的弹出列表中,选择以下选项之一: Getter 获取所选字段当前值的访问器方法。 Setter 将指定值设置为所选字段的变异器方法。 Getter 和 Setter 所选字段的两种方法。
  3. 在“选择要生成 Getter 和 Setter 的字段”对话框中,选择所需的字段。 您可以通过单击 browseButton 并访问 Getter/Setter 模板对话框来添加自定义 setter 或 getter。 如果字段已经存在 getter 和 setter,则不会将该字段包括在列表中。
  4. 单击确定。
    有关更多信息,请转到 link

Getter和Setter只提供了简单的getter和setter。我需要在这些变量上做一些其他的事情。尝试使用自定义的getter和setter,但是我无法添加多个getter/setter。 - A0__oN
@AmanTuladhar,你的意思是什么:我不能添加多个getter/setter? - Abdelhak
例如,我有一个变量x。如果我自动生成getter和setter,我可以有一个getter和一个setter用于x。但是看看我的例子,我有许多方法用于一个变量,不仅仅是getter和setter。我也需要它们自动生成。 - A0__oN
我按照你给我的步骤(链接上的)进行了操作。但是我找不到定义两个getter/setter的部分。 - A0__oN

-4

你无法自动生成自定义方法。对于自定义方法,你必须定义它们,这就是为什么它被称为自定义。 最好的方法只能获得基本的getter和setter方法,我想你已经有了这些。
或者 你可以这样做: class Button{ string button }

类buttonProperties{

int buttonLength; int buttonSize;

public int getbuttonSize(){

return buttonSize;

} . . .

}


那是非常错误的。Lombok会相应地对代码进行处理。 - Markus W Mahlberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接