Указатель на функцию в Java - PullRequest
2 голосов
/ 22 июля 2009

Я пишу страницу входа в wicket by java и хочу написать ее как можно более общей, поэтому мне нужно перейти к классу функции, которая известна как Function Pointer в C ++. Класс:

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

где аутентификация - это функция, что мне делать?

Ответы [ 3 ]

9 голосов
/ 22 июля 2009

Просто передайте интерфейс, который определяет метод authenticate.

void DoSomething(IAuthenticationProvider authProvider) {
    // ...
    authProvider.authenticate();
}
1 голос
/ 22 июля 2009

Вы можете использовать внутренний класс

0 голосов
/ 23 марта 2013

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

Надеюсь, это поможет.

...