java - 如何在辅助类中使用存储在主类中的字符串值? (详情请参见说明。Java)

标签 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) {

        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/

相关文章:

java - 我是否需要为 java 中的一个函数创建单独的服务类

Java "Duplicate local variable"- 错误是在 Java 还是 Eclipse 中引发的?

java - 自从更改 SpringBoot 依赖性以来,在空字段上加入时出现 Freemarker 错误

objective-c - 将密码范围移出界限

寻找长度为 k 的第一个重复子串的算法

C# 字符串格式

python - PyQt4 如何通过单击按钮使用多处理

c++ - 为 C++ 中的类提供动态数组的默认值

java - Spring 中使用 Hessian 远程处理的客户端基本 HTTP 身份验证

java - 具有 IP 验证且仅允许用户投票的机制 : problem in getting user IP address with two app servers and apache in front