Как я могу использовать значения Strings, хранящиеся в главном классе в моем вторичном классе?(подробности см. в описании. Java) - PullRequest
0 голосов
/ 16 мая 2018

Я получил класс 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 , который будет выполнять набор действий, а затем ему понадобятся сохраненные строки: Имя пользователя и Пароль для выполнения действий. ,

Моя проблема в том, что я понятия не имел, как просто получить значения хранимых строк в главном классе и использовать их во вторичном классе БЕЗ получения запроса снова. Я хочу запустить свой основной класс, получить 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;

    }

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

в объявлении переменной MainClassTestPrompt должно быть перед попыткой перехватить блок, тогда он будет работать. Как вы написали, переменные String Username; String Password arelocal, чтобы попробовать catch, и вы не можете получить к ним доступ из 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);
		
		} 

	}
}

, затем позвоните в Secondary

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

Ваш код для SecondClass также будет работать, если вы хотите использовать наследование только при расширении MainClass. Но если вы хотите использовать пароль и имя пользователя где-либо еще, лучше написать правильные методы get ().

0 голосов
/ 16 мая 2018

Я предполагаю, что вы очень плохо знакомы с 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();
        ...
    }
}
...