繁体   English   中英

如何使用存储在辅助类中主类中的Strings值? (有关详细信息,请参见描述。Java)

[英]How can I use the Strings values stored in a main class in my secondary class? (see description for details. Java)

我得到了一个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 ,它将执行一组操作,然后将需要存储的字符串: UsernamePassword以执行操作。

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

我在第二堂课上尝试过的

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());
    }
}

现在您的呼叫者类可能如下所示:

class SecondaryClassUseCredentials {

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

对于下一次迭代,请尝试摆脱静态变量并使用接口。 为了让您自己尝试一下,我只会建议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();
        ...
    }
}

在MainClassTestPrompt中,变量声明应该在try catch块之前,然后它将起作用。 在编写时,变量为String Username; String Password String Username; String Password本地的,可以尝试捕获,您不能从SecondaryClass访问它们。

 public class MainClassTestPrompts { //Better private String Username; private String Password; public String getUsername(){ return this.Username; } public String getPassword(){ return this.Password; } public static void main(String[] args) { JTextField username = new JTextField(); JTextField password = new JPasswordField(); Object[] DBInputBox = { "Username:", username, "Password:", password}; //Not ideal but will work try { // I. Username and Password Prompts JOptionPane.showConfirmDialog(null, DBInputBox, "Login", JOptionPane.OK_CANCEL_OPTION); //Edited Username = username.getText(); Password = password.getText(); System.out.println("Username: " + Username); System.out.println("Password: " + Password); } catch (Exception e) { System.out.println(e); } } } 

然后在中学

 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.getUsername(); //I know this is wrong but is sort of what I'm looking for... String Password = MainClassTestPrompts.getPassword(); } 

如果在扩展MainClass时只想使用继承,那么SecondClass的代码也将起作用。 但是,如果您想在其他任何地方使用密码和用户名,则最好编写适当的get()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM