2017-04-14 17 views
0

私のアプリケーションの重複チェックのようにしようとしています。メソッドを使用して引数としてクラスからゲッターを渡すことができません

たとえば、ユーザーはユーザー名を変更したいので、基本的にクラスからユーザー名を取得し、重複した関数チェックを使用してユーザー入力と比較するゲッター関数があります。

しかし、私はこのようなチェックを必要とするフィールドを10個まで持ち、10個の異なるフィールドに対して10個の異なる重複機能チェックを作成して、コードを非常に長く乱雑にしています。

したがって、このmethodライブラリを使用して、複数の関数を作成する代わりにメソッドに関数を渡しました。ここで

cannot convert string to method

したがって、私は私が文字列、それが言うように、それを宣言した私のクラスから私のgetterメソッドとメソッドの変数を初期化しようとすると、ライブラリ

//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メソッド

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

public String getuserName() 
{ 
    return userName; 
} 
+1

'p'とは何ですか?どのように初期化されますか? –

+0

@RomanPuchkovskiyは間違いを発見してくれてありがとう。私はコードを書き直して、このスレッドのデバッグをより簡単に簡単にしました。そして、 'p'を' u'に変更するのを忘れました。 –

+0

'getuserData()'は何を返しますか?コードを表示してください。 –

答えて

1

私が正しくあなたの要件を理解し、あなたHAVA場合Java 8、lambdaおよびメソッド参照が役立ちます。

A少し一般化バージョン:

//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; 
} 

その後、あなたはこのようにそれを呼び出す:あなたはUserクラスでgetPassword()メソッドを持っている場合

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

そして

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

などに。

ここでは、すべてのゲッターメソッドが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

0

は、メソッドを使用する必要はありませんです。

userDataのユーザー名の文字列値と、ユーザーが入力したユーザー名を比較するだけです。

MethodStringに変更してください。

編集(あなたが変更する必要があるもの):

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; 
} 
+0

私は文字列を返すメソッドが必要なので、私はそれを行うことはできません –

+0

@TeoChuenWeiBryan ya、あなたのメソッドが返す文字列型です。だから、 'Method'データ型を使うべきではありません。代わりに' String'データ型を使うべきです。 – yun

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;   
} 
関連する問題