Есть ли способ передать метод мутатора в качестве аргумента другому методу? - PullRequest
0 голосов
/ 25 мая 2018

Я создаю текстовую игру, у меня есть класс для главного героя, чтобы вы могли задать имя персонажа и т. Д. Я пытаюсь выяснить, есть ли способ передать мутатор (символ.имя (вход) в качестве аргумента другого метода.Когда я пытаюсь это сделать, мне говорят, что я не могу использовать тип void в качестве аргумента метода.Когда я писал код для пользователя, чтобы ввести его имя, и все остальное, оно было повторяющимся с проверкой ошибок, поэтому я хотел создать свой собственный метод, который я мог бы вызвать, который бы проверял ошибки для меня.Пара предложений использует метод setname для сброса имени, если оно было введено неправильно, но я не могу напрямую использовать setname в методе проверки ошибок, потому что он будет использовать тот же метод для проверки других вводов данных.

Есть ли способ обойти это?

Вот запрашиваемый код: я действительно, может быть, слишком усложняю проблему, я довольно плохо знаком с Java, поэтому я все еще учусь.

Следующий код - это код, который я использую дляпроверить, правильно ли пользователь ввел что-то, он принимает массив, который содержит все возможные правильные ответы, которые может набрать пользователь. Я попытался спроектировать его таким образом, чтобы можно было что-то проверять на ошибки, а не просто «да» илиоператоры no, getVariable - это метод доступа, а setVariable - тот, который я пытаюсь заставить работать, я также пытаюсь передать мутатор, чтобы сбросить ошибку

public void confirmEntry(String question, String[] options, String getVariable, setVariable) throws InterruptedException
{
    boolean correctEntry = false;
    System.out.print("Is this correct? ");
    for(int i = 0; i < options.length - 1; i++)
    {
        System.out.print(options[i] + ", ");
    }
    System.out.print("or ");
    System.out.print(options[options.length - 1] + ": ");
    input = in.nextLine();
    for(int i = 0; i < options.length; i++)
    {
        if(input.equals(options[i]))
        {
            correctEntry = true;
            System.out.println(correctEntry);
        }
    }
    System.out.println(correctEntry);
    while(correctEntry == false)
    {
        Thread.sleep(2000);
        System.out.print("You must enter ");
        for(int i = 0; i < options.length - 1; i++)
        {
            System.out.print("\"" + options[i] + "\", ");
        }
        System.out.print("or ");
        System.out.print("\"" + options[options.length - 1] + "\" to continue: ");
        Thread.sleep(2000);
        System.out.println();
        System.out.println("You chose " + getVariable);
        Thread.sleep(2000);
        System.out.print("Is this correct? ");
        for(int i = 0; i < options.length - 1; i++)
        {
            System.out.print(options[i] + ", ");
        }
        System.out.print(" or ");
        System.out.print(options[options.length - 1] + ": ");
        input = in.nextLine();

        for(int i = 0; i < options.length; i++)
        {
            if(input.equals(options[i]))
            {
                correctEntry = true;
            }
        }
    }
}

Следующий код - это то, что в данный момент используется в методе, где вы вводите информацию о персонаже.Я пытаюсь перенести больше кода в метод проверки ошибок, чтобы каждый раз, когда я задавал пользователю вопрос, имя, возраст и т. Д., Мне просто нужно было вызвать метод.

public void characterCreation() throws Exception
{
    //create an instance of the class player (your character creation)
    Player character = new Player();

    //Initial Introduction to the game
    System.out.println("Welcome to Stranded!");
    Thread.sleep(2000);
    System.out.println("Tell us a little about yourself!");
    Thread.sleep(2000);


    //______________________________________________________________________________________________________________
    //SET YOUR CHARACTER'S NAME
    String[] yesNo = {"yes", "no"};                                         //array to feed into confirmEntry method
    System.out.print("Enter your character's name: ");
    input = in.nextLine();                                                  //asks for input of the name
    character.setName(input);                                               //sets name in the player class
    System.out.println("You chose " + character.getName() 
    + " for your character's name");                                       
    Thread.sleep(2000);

    confirmEntry("Enter your character's name: ", yesNo, character.getName(), character.setName(input));
    while(input.equals("no"))
    {
        Thread.sleep(2000);
        System.out.print("Enter your character's name: ");                  //prompt to enter name again
        input = in.nextLine();
        character.setName(input);                                           //sets name in player class
        Thread.sleep(2000);
        System.out.println("You chose " + character.getName() 
        + " for your character's name");                                   //confirms what user entered for name
        Thread.sleep(2000);
        confirmEntry("Enter your character's name: ", yesNo, character.getName(), character.setName(input));
    }

Я пытаюсь переместить больше кода после комментария SET CHARACTER NAME в метод verifyEntry, однако остальная часть кода, связанного с именем персонажа, использует мутатор для установки имени.Это проблема.Я хотел попытаться получить как можно больше кода в verifyEntry, поэтому всякий раз, когда я прошу пользователя ввести что-то об их персонаже, мне просто нужно вызвать метод.

Ответы [ 2 ]

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

Что такое запись?Похоже, что это определенное значение, которое ввел пользователь.

class Entry{
    String value;
    public Entry(String value){
        this.value = value;
    }
    public boolean confirm(String input){
        return value.equals(input);
    }
}

Как насчет того, чтобы вы сохранили все свои записи.

Map<String, Entry> entries = new HashMap<>();

String message = "Enter your character's name: ";
System.out.println(message);
String input = in.nextLine();

entries.put(message, new Entry(input));

Теперь, когда вы хотите подтвердить.

public void confirmEntries(){
    for(String message: entries.keySet()){
        System.out.println(message);
        System.out.println(entries.get(message) + "yes/no?");
        //get some input and update the value. etc.
    }
}

Еще один способ сделать это - создать Runnables.

List<Runnable> entryRunnables = new ArrayList<>();

Затем в любое время вы захотите добавить действие.

Runnable r = ()->{
    System.out.println("Enter your players name, yes/no");
    String input = in.readLine();
    //check input and do stuff.
}

entryRunnables.add(r);

Теперь для проверки записей.(потоковый метод)

entryRunnables.forEach(Runnable::run);

Или

for(Runnable r: entryRunnables){
     r.run();
}
0 голосов
/ 25 мая 2018

Если вы используете java 8 , вы можете создать свой метод со ссылочным параметром метода:

public void functionName(Consumer<String> setter){setter.
accept(string);}

и для вызова вашего метода вы можете использовать:functionName(character::setname);

Вы можете увидеть: http://www.informit.com/articles/article.aspx?p=2171751&seqNum=3

...