我正在尝试对我的应用程序进行重复检查。
例如,用户想要更改他的用户名,因此,我得到了一个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;
}
答案 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;
}