如何在次要类中使用主类中存储的字符串值?(有关详细信息,请参见description.Java)

如何在次要类中使用主类中存储的字符串值?(有关详细信息,请参见description.Java),java,string,class,methods,extension-methods,Java,String,Class,Methods,Extension Methods,我得到了一个类MainClassTestPrompts,该类使用输入框向用户询问用户名和密码,然后将每个值存储在各个字符串上 import javax.swing.JOptionPane; import javax.swing.JPasswordField; import javax.swing.JTextField; public class MainClassTestPrompts { public static void main(String[] args) {

我得到了一个类MainClassTestPrompts,该类使用输入框向用户询问用户名和密码,然后将每个值存储在各个字符串上

import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class MainClassTestPrompts {

    public static void main(String[] args) {

        JTextField username = new JTextField();
        JTextField password = new JPasswordField();
        Object[] DBInputBox = { "Username:", username, "Password:", password };

        try {

            // I. Username and Password Prompts
            JOptionPane.showConfirmDialog(null, DBInputBox, "Login", JOptionPane.OK_CANCEL_OPTION);

            String Username = username.getText();
            String Password = password.getText();

            System.out.println("Username: " + Username);
            System.out.println("Password: " + Password);

        } catch (Exception e) {
            System.out.println(e);

        } 

    }
}
然后我有另一个类,它将执行一组操作,然后需要存储的字符串:用户名和密码来执行操作

我的问题是,我不知道如何在主类中获取存储的字符串值,并在次类中使用它们,而不会再次得到提示。我想运行我的主类,获取user/pass,然后最终运行第二个类,该类将选择存储的值

我在第二节课上试过的内容

public class SecondaryClassUseCredentials extends MainClassTestPrompts {

    public static void main(String[] args) {

        MainClassTestPrompts.main(null); // this will just run the MainClassTestPrompt which is not what I want.

        String Username = MainClassTestPrompts.Username; //I know this is wrong but is sort of what I'm looking for... 
        String Password = MainClassTestPrompts.Password;

    }

我将假设您对Java非常陌生,可能还不熟悉编程,否则很难解释您的设计决策

首先,有一个设计原则是正确的:一个类应该做一件事。因此,您的
MainClassTestPrompts
提示输入用户名和密码,而您的
SecondaryClassUseCredentials
希望对这些进行处理。这被称为关注点分离

错误是在两者中都使用
main
,或者使用没有返回类型的方法。由于
main
被用作应用程序入口点,因此最好不要在这两个类中使用
main
——它们是业务逻辑的一部分,应用程序连接应该是另一个关注点

因此,您可以定义一个类/方法对,该类/方法对请求凭证并返回凭证,另一个类/方法对调用前者并使用其结果。每次执行一个步骤我将保留静态方法,不引入任何接口,即使这是我通常建议的:

class MainClassTestPrompts {

   static Map.Entry<String, String> askForCredentials() {
        JTextField username = new JTextField();
        JTextField password = new JPasswordField();
        Object[] DBInputBox = { "Username:", username, "Password:", password };

        JOptionPane.showConfirmDialog(null, DBInputBox, "Login", JOptionPane.OK_CANCEL_OPTION);
        return new SimpleEntry<>(username.getText(), password.getText());
    }
}

在MainClassTestPrompt中,变量声明应该在try catch块之前,然后才能工作。在编写时,变量
字符串用户名;字符串密码
是本地密码,无法从SecondaryClass访问。
public类MainClassTestPrompts{
//更好
私有字符串用户名;
私有字符串密码;
公共字符串getUsername(){
返回这个.Username;
}
公共字符串getPassword(){
返回此密码;
} 
公共静态void main(字符串[]args){
JTextField username=新的JTextField();
JTextField password=新的JPasswordField();
对象[]DBInputBox={“用户名:”,用户名,“密码:”,密码};
//不理想,但会奏效
试一试{
//I.用户名和密码提示
JOptionPane.showConfirmDialog(空,
数据库输入框,
“登录”,
JOptionPane.OK\u CANCEL\u选项);
//编辑
Username=Username.getText();
Password=Password.getText();
System.out.println(“用户名:”+用户名);
System.out.println(“密码:”+密码);
}捕获(例外e){
系统输出打印ln(e);
} 
}

}
通常一个系统中只有一个
main
方法,因此您的问题有点奇怪。解决方法是将该代码从静态世界中取出,进入实例世界。首先要创建与面向对象兼容的类。传递数据的常用方法是向对象传递引用。这要求您设计一个带有参数列表的方法,该参数列表将接受您想要的数据,而不仅仅是复制
main
方法样板。例如,
publicstaticvoidmymethod(stringusername,stringpassword){
这里的变量名很糟糕。特别是,
stringusername=username.getText();
-不。不要这样做。
username
看起来像一个类,现在如果我来告诉你“username”was
null
-我说的是哪一个?局部变量只被赋予局部作用域;你可能想在某个地方使用字段。你真的建议用从另一个
main
方法调用的静态
main
方法填充实例字段,然后通过getter公开这些字段吗?让我们来破解一下我的方法……就像他那样问这个问题并不意味着对变量有任何保护。第二,他写了两个带有2个main的类,但有人已经建议对其进行修复。第三个也是最后一个,他扩展了main类,建议继承。是的,我对Java和编程非常陌生(在it世界中拥有机械工程学位).无论如何,我会在这周内消化这一点,并尝试一下,看看我是否能做到我想要的。我知道我使用的逻辑不会有太多意义,但只是我正在尝试将其集成到现有的Selenium框架中,如果我添加此信息,这将使问题变得更长。谢谢回答。
class SecondaryClassUseCredentials {

   static void doSomething() {
        Map.Entry<String, String> credentials = MainClassTestPrompts.askForCredentials();
        String username = credentials.getKey();
        String password = credentials.getValue();
        ...
    }
}
class SecondaryClassUseCredentials {

   private final Supplier<Map.Entry<String, String>> credentialsSupplier;

   SecondaryClassUseCredentials(Supplier<Map.Entry<String, String>> credentialsSupplier) {
       this.credentialsSupplier = credentialsSupplier;
   }

   static void doSomething() {
        Map.Entry<String, String> credentials = credentialsSupplier.get();
        String username = credentials.getKey();
        String password = credentials.getValue();
        ...
    }
}