有没有办法将mutator方法作为参数传递给另一个方法?

时间:2018-05-25 12:38:05

标签: java mutators

我正在创建一个基于文本的游戏,我有一个为主角制作的课程,因此您可以设置角色名称等。我想弄清楚的是,有什么方法可以将一个mutator(character.setname(input))作为参数传递给另一个方法。当我尝试这样做时,我告诉我不能使用void类型作为方法的参数。当我写出用户输入他们的名字的代码,以及其他一切都是重复的错误检查,所以我想创建我自己的方法,我可以调用,这将错误检查我。如果输入的名称不正确,可以使用setname方法重置名称,但我不能在错误检查方法中直接使用setname,因为它将使用相同的方法检查其他数据输入

这有什么办法吗?

以下是所要求的代码:我的确可能会使问题过于复杂,我对java很新,所以我还在学习。

以下代码是我用来检查用户是否正确输入内容的代码,它接受一个包含用户可以输入的所有可能正确答案的数组,我试图以一种方式设计它我可以使用它进行错误检查,而不仅仅是"是"或"不"语句,getVariable是访问器方法,而setVariable是我试图开始工作的那个,我也试图传递mutator,所以我可以重置错误

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注释之后将更多代码移动到confirmEntry方法中,但是包含该字符名称的其余代码使用mutator来设置名称。这就是问题所在。我想尝试尽可能多地将代码输入confirmEntry,所以每当我要求用户输入关于他们角色的东西时,我基本上只需要调用该方法。

2 个答案:

答案 0 :(得分:0)

如果您使用的是 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

答案 1 :(得分:0)

什么是参赛作品?它似乎是用户输入的一些值。

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