Вопрос
Я пишу страницу входа в калитку с помощью Java и хочу написать ее как можно более общую, поэтому мне нужно передать классу функцию, известную как указатель функции в 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);
}
}
}
где аутентифицировать эту функцию, что мне делать?
Решение
Просто передайте интерфейс, который определяет authenticate
метод.
void DoSomething(IAuthenticationProvider authProvider) {
// ...
authProvider.authenticate();
}
Другие советы
Вы можете использовать внутренний класс
В 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();
}
};
);
Надеюсь, поможет.