【问题标题】:JAVA: Add new parameter to a methodJAVA:向方法添加新参数
【发布时间】:2017-02-23 09:33:12
【问题描述】:

我有一个方法 addNewUser 询问用户的用户名、电子邮件和密码。这些将存储在相应列的 excel 工作表中。请看下面的代码:

public class ExcelConfig {



public FileInputStream fis;
public FileOutputStream fos;
public XSSFWorkbook wb;
public XSSFSheet sh;
public XSSFRow row;
public XSSFCell cell;

int lastRow = 0;

ConfigReader cr = new ConfigReader();

public ExcelConfig(){

      try {
        fis = new FileInputStream(cr.getExcelPath());
        wb = new XSSFWorkbook(fis);
       } 
       catch (Exception e) {
        System.out.println("Error at ExcelConfig " + e.getMessage());
       }


}


public void addNewUser(String un, String em, String pw){


      cell = row.createCell(0);
      cell.setCellValue(un);

      cell = row.createCell(1);
      cell.setCellValue(em);

      cell = row.createCell(2);
      cell.setCellValue(pw);


}

}

现在,在其他类中,我调用了 addNewuser 方法。见下方代码

public class NextStepTest {

WebDriver driver;

ConfigReader cf;
ExcelConfig ec;
UserDetails ud;

LandingPage lp;
RegisterPage rp;

String username;
String email;
String password;




@BeforeTest
public void setUp(){
    cf = new ConfigReader();
    ec = new ExcelConfig();
    ud = new UserDetails();


    driver = cf.getChromeDriver();
    driver.get(cf.getAppUrl());


}

@Test
public void register(){

    username = cf.getUsernameFromProperty();
    email = cf.getEmailFromProperty();
    password = ud.getPassword();

    try{

        lp = new LandingPage(driver);
        lp = PageFactory.initElements(driver, LandingPage.class);

        lp.locateRegisterLink();
        lp.clickRegisterLink();

        rp = new RegisterPage(driver);
        rp = PageFactory.initElements(driver, RegisterPage.class);


        rp.locateUsernameField();
        rp.registerAccount(username, email, password);


        ec.getSheet(0);
        ec.getNextRow();
        ec.addNewUser(username, email, password); // here I call addNewUser method that now has username, email and password values
        ec.closeFile();

        rp.logout();
        lp.locateLoginLink();



    }
    catch(Exception e){
        System.out.println("Error under NextStepTest.java => " + e.getMessage());

    }



}

现在,我想问的是,是否可以使 addNewUser 方法参数动态化?我知道这种情况取决于项目。在这种情况下,某些项目可能只需要将用户名、电子邮件和密码添加到 Excel 中。如果在未来的其他项目中,需要添加帐户类型怎么办?所以参数现在将变为 4。或者其他项目只需要电子邮件和密码。我应该每次都更新 addNewUser 方法参数吗?我仍然是这门语言的初学者。任何帮助都可以。谢谢大家!

【问题讨论】:

  • 让你的方法接受一个可变参数:String ... args。请学一点Java。
  • @EgorZhuk Bit 是不够的.. :D
  • 也许你的addNewUser 应该接受某种NewUserParameters 对象。您可以使用给定上下文中所需的任何参数构建这样的对象,然后将其传递给您的方法。另见builder pattern
  • 您可以将参数作为用户对象传递,在其中您可以传递您想要的任何参数。如果您想添加更多属性,可以通过将它们添加到您的 User 类来实现。

标签: java methods parameters


【解决方案1】:

您可以使用地图作为参数。这将帮助您动态传递参数。

 public void addNewUser(Map<String, Object> mapInput){
    Iterator entries = mapInput.entrySet().iterator();
    int i=0;
    while (entries.hasNext()) {
        Entry thisEntry = (Entry) entries.next();
        String value = (String)thisEntry.getValue();
        cell = row.createCell(i);
        cell.setCellValue(value);
        i++;
    }
}

【讨论】:

    【解决方案2】:

    您可以创建一个接口 AddNewUser,它有一个方法 createUser,例如返回创建的 XSSFRow 行。

    然后您创建该接口的实现,例如AddUserWithEmail,在构造函数中获取特定值,然后在 createUser 方法中将用户和电子邮件添加到行。

    如果您有其他客户需要表中的不同值,您只需创建 AddNewUser 接口的新变体并使用它。

    【讨论】:

      【解决方案3】:

      如果在未来的其他项目中,需要添加一个 帐户类型?

      那么以后你需要重载方法

      public void addNewUser(String un, String em, String pw){
      
      }
      
      //only username
      public void addNewUser(String un){
      
      }
      
      //with all the info + token
      public void addNewUser(String un, String em, String pw, String token){
      
      }
      

      您唯一需要注意的是:这些都是字符串...所以您需要提前知道哪个字符串对应哪个参数...

      【讨论】:

        【解决方案4】:

        是的,这是可能的。通过使用 thi 可变参数参数:

        public void foo(String... strings){
            // method body
        }
        

        所以你可以用这个函数调用:

        foo("name");
        foo("name", "account");
        foo("name", "account", "age");
        

        等等……

        并像这样使用这个参数:

        public void foo(String... strings) {
                if (0 < strings.length()) {
                    String name = strings[0];
                }
                if (1 < strings.length()) {
                    String account = strings[1];
                }
                if (2 < strings.length()) {
                    String account = strings[2];
                }
                // etc
            }
        

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 2019-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多