无法使用方法从类中传入getter作为参数

时间:2017-04-14 08:55:53

标签: java

我正在尝试对我的应用程序进行重复检查。

例如,用户想要更改他的用户名,因此,我得到了一个getter函数,它基本上从我的类中获取用户名,并通过重复的函数检查与用户输入进行比较。

但是,我有多达10个需要进行此类检查的字段,其中很长的方法是为10个不同的字段创建10个不同的重复功能检查,这使得我的代码非常冗长和混乱。

因此,我使用这个method库将方法传递给函数而不是创建多个函数。

以下是我尝试使用该库的方法

//place where i read input and display any necessary info.
import java.lang.reflect.Method;

public void editUser()
{
    Method method;
    boolean found = false;
    String userName = Keyboard.readString("Input username to change : ");

    for(User u : userData)
    {
        method = u.getuserName(); // error occur here, cannot convert string to method
        found = checkExist(userData, userName, method);
        if(!found)
        {
            System.out.println("does not exist");   
        }

        //do whatever stuffs if exist

    }
}

//function that check for existance.
public void boolean checkExist(ArrayList<User> userData, String userName, Method method)
{
    boolean found = false;

    for(User u : userData)
    {                       
        if(userName.equals(method))
        {
            found=true;
            break;
        }           
        else 
            found=false;            
    }   
    return found;
}

当我尝试使用我的类中的getter方法初始化方法变量时,我将其声明为字符串,它表示cannot convert string to method

因此,我可以从我的其他类传递我的getter函数而不将字符串更改为方法的方式是什么,因为其他函数在此getter方法上也是可靠的。

这是构造函数和getter方法

public Player(String userName)
{
    this.userName=userName; 
}

public String getuserName() 
{
    return userName;
}

3 个答案:

答案 0 :(得分:1)

如果我正确理解您的要求并且您使用Java 8,那么lambdas和方法参考可以提供帮助。

略微概括的版本:

//function that check for existance.
public void boolean checkExist(ArrayList<User> userData, String value, Function<User, String> getter)
{
    boolean found = false;

    for(User u : userData)
    {
        String userValue = getter.apply(user);
        if(value.equals(userValue))
        {
            found=true;
            break;
        }           
        else 
            found=false;            
    }   
    return found;
}

然后你这样称呼它:

found = checkExist(userData, userName, User::getuserName);

然后

found &= checkExist(userData, password, User::getPassword);

如果您在getPassword()课程中有User方法,等等。

这里我假设你的所有getter方法都返回String个值。如果没有,你可以用

之类的东西进一步概括
public void <T> boolean checkExist(ArrayList<User> userData, String value, Function<User, T> getter)

如果您没有Java 8,则可以使用匿名类语法:

    new Function<User, String>() {
        public String apply(User user) {
            return user.getuserName();
        }
    };

而不是User::getuserName

答案 1 :(得分:0)

在您的情况下,不需要使用方法。

只需将userData用户名的String值与用户输入的用户名进行比较。

所以只需将Method更改为String

编辑(您需要更改的内容):

public void editUser()
{
    String method;
    boolean found = false;
    String userName = Keyboard.readString("Input username to change : ");

    for(User u : userData)
    {
        method = u.getuserName(); // error occur here, cannot convert string to method
        found = checkExist(userData, userName, method);
        if(!found)
        {
            System.out.println("does not exist");   
        }

        //do whatever stuffs if exist

    }
}

//function that check for existance.
public void boolean checkExist(ArrayList<User> userData, String userName, String method)
{
    boolean found = false;

    for(User u : userData)
    {                       
        if(userName.equals(method))
        {
            found=true;
            break;
        }           
        else 
            found=false;            
    }   
    return found;
}

答案 2 :(得分:0)

所以你关注的是代码可重用性,你可以这样做,

public void editUser(){
    String userName = Keyboard.readString("Input username to change : ");
    if(!checkExist(userList,userName,"name")){
         System.out.println("does not exist");   
    }
}

public void boolean checkExist(ArrayList<User> userList, String fieldName, String fieldValue){
    boolean isExists =false;
    for(User u : userList){  
        switch(fieldName){
            case "name":
                 if(fieldValue.equals(u.getName())
                    isExists = true;// username already exists...
                 break;// to exit from switch...
            case "someotherfield":
            .
            .
            .
        }                     

    }  
    return isExists;         
}