2009-07-22 5 views
2

자바에 의해 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- 자바) – Raedwald

답변

9

를 사용할 수 있습니다.

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

예, Java에서는 함수 포인터 대신 인터페이스를 사용합니다. 따라서 호출하고자하는 함수를 정의한 인터페이스를 정의한 다음 위의 예와 같이 인터페이스를 호출하십시오. 인터페이스를 구현하기 위해 추가 파일의 오버 헤드를 원하지 않으면 익명 내부 클래스를 사용할 수 있습니다. –

1

당신은 그냥 authenticate 방법을 정의하는 인터페이스를 통과 내부 클래스

+0

내부 클래스는 그것을 해결하지 청소 문제입니다 !!!! – JGC

0

자바에서는 함수 객체가 아니라 호출 함수 포인터가 없습니다. 이것으로 메소드가 다른 객체에 대한 연산을 수행하는 객체를 정의 할 수 있습니다. 예 :

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

희망이 있습니다.