2009-07-22 12 views
2

私はJavaのwicketにログインページを書いていますので、できるだけ一般的なものを書こうと思っていますので、C++の関数ポインタとして有名な関数をクラスに渡す必要があります。 クラスは次のとおりです。関数ポインタJavaの

認証は、私が何をすべきという機能です
class LoginForm extends Form 
{ 

    public LoginForm(String id,TextField username,TextField password,WebResponse webResponse) 
    { 
     super(id); 
    } 

    @Override 
    public void onSubmit() 
    { 
     String password = Login.this.getPassword(); 
     String userId = Login.this.getUserId(); 
     String role = authenticate(userId, password); 
     if (role != null) 
     { 
      if (Login.this.getSave()) 
      { 
       utilities.CreateCookie("Username", userId, false, 1209600, (WebResponse) getRequestCycle().getResponse()); 
       utilities.CreateCookie("Password", password, false, 1209600, (WebResponse) getRequestCycle().getResponse()); 
      } 
      User loggedInUser = new User(userId, role); 
      WiaSession session = (WiaSession) getSession(); 
      session.setUser(loggedInUser); 
      if (!continueToOriginalDestination()) 
      { 
       setResponsePage(UserHome.class); 
      } 
     } 
     else 
     { 
      wrongUserPass.setVisible(true); 
     } 
    } 
} 

+2

[Javaの関数ポインタの最も近い代用品は何ですか?](http://stackoverflow.com/questions/122407/whats-the-nearest-substitute-for-a-function-pointer-in- java) – Raedwald

答えて

9

authenticateメソッドを定義するインターフェイスを渡すだけです。

void DoSomething(IAuthenticationProvider authProvider) { 
    // ... 
    authProvider.authenticate(); 
} 
+0

はい、Javaでは、関数ポインタの代わりにインタフェースを使用します。したがって、呼び出す関数を定義したインタフェースを定義し、上の例のようにインタフェースを呼び出します。インターフェイスを実装するには、追加のファイルのオーバーヘッドを必要としない場合は、匿名の内部クラスを使用できます。 –

1

内部クラスを使用できます

+0

内部クラスはそれを解決しない質問をクリーニングしています!! – JGC

0

javaでは、関数オブジェクトではなく、呼び出し関数ポインタはありません。これで、メソッドが他のオブジェクトに対して操作を実行するオブジェクトを定義することができます。例えば

class MyClass 
{ 
     public void myFunction(String s1, String s2) 
     { 
      return s1.length() - s2.length(); 
     } 
} 

MyClass m = new MyClass(); 
m.myFunction("nnnnnn", "mmmmmmmmmmm"); 

これは機能オブジェクトに過ぎません。インタフェースルールにコードを従えば、インタフェースを定義し、ジェネリックも使うことができます。

public interface MyInterface<T> 
{ 
     public void myFunction(T s1, T s2); 
} 

これで元のクラスでこのインターフェイスを実装できます。上記の例は、Comparatorインターフェイスの例を単純に変更したものです。具体的なクラスが必要ない場合は、匿名クラスも使用できます。

Arrays.sort(stringArray, new Comparator <String>() 
    { 
     public int compare(String s1, String s2) 
      { 
        return s1.length() - s2.length(); 
      } 
    }; 
); 

希望します。