我有一个类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);
}
}
}
然后我有另一个类SecondaryClass,它将执行一组操作,然后需要存储的字符串:用户名和密码执行操作。
我的问题是,我不知道如何获取主类中存储的字符串值并在辅助类中使用它们,而无需再次收到提示。我想运行我的主类,获取用户/通行证,然后最终运行第二个类,该类将选择存储的值。
我在第二堂课上尝试过的
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
——它们是业务逻辑的一部分,应用程序接线应该是还有一个问题。
因此,您可以做的是定义一个类/方法对,该类/方法对请求凭据并返回这些凭据,而另一对类/方法则调用前者并使用其结果。 一次一步我将保留静态方法并且不引入任何接口(interface),尽管这是我通常建议的:
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());
}
}
现在您的调用者类可能如下所示:
class SecondaryClassUseCredentials {
static void doSomething() {
Map.Entry<String, String> credentials = MainClassTestPrompts.askForCredentials();
String username = credentials.getKey();
String password = credentials.getValue();
...
}
}
对于下一次迭代,尝试摆脱静态并使用接口(interface)。为了让您自己尝试一些东西,我只会建议 SecondaryClassUseCredentials
的外观:
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();
...
}
}
关于java - 如何在辅助类中使用存储在主类中的字符串值? (详情请参见说明。Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50359690/