> Java > java지도 시간 > 익명 클래스를 사용하여 Java에서 콜백 함수를 구현하는 방법에 대한 설명 예

익명 클래스를 사용하여 Java에서 콜백 함수를 구현하는 방법에 대한 설명 예

黄舟
풀어 주다: 2017-08-22 10:10:45
원래의
1639명이 탐색했습니다.

이 기사에서는 익명 클래스를 통해 Java에서 콜백 함수를 구현하는 예를 주로 소개합니다. 콜백 함수는 함수 시그니처(여러 입력 매개변수, 하나의 출력 매개변수)의 사양이지만 Java에서는 인터페이스를 사용하여 강제할 수 있습니다. 규정. 구체적인 동작 단계에 대한 자세한 설명은 아래에서 확인하실 수 있으며, 관심 있는 친구들은 참고하실 수 있습니다.

C 언어에서는 함수 이름을 형식 매개변수에 대한 함수 포인터로 전달하여 콜백을 구현할 수 있습니다.


void f1() { printf("f1()\n"); }
void f2() { printf("f2()\n"); }
void f3() { printf("f3()\n"); }
void do_func(void(*f)()) { f(); }
int main()
{
  do_func(f1);
  do_func(f2);
  do_func(f3);
}
로그인 후 복사

C++11에서는 함수 템플릿과 람다 표현식을 통해 콜백을 구현할 수도 있습니다.


template <typename Func>
void do_func(Func f) { f(); }
int main()
{
  do_func([]() { printf("f1()"); });
  do_func([]() { printf("f2()"); });
  do_func([]() { printf("f3()"); });
}
로그인 후 복사

If 콜백 함수의 코드 구현은 상대적으로 복잡하고 재사용 가치가 있으므로 람다 표현식과 같은 일회성 솔루션은 적합하지 않습니다. C++11 이전에는 함수 개체를 통해 구현되었습니다. 직설적으로 말하면 함수 객체는 클래스의 일반적인 객체이지만 C++에서는 대괄호 연산자를 오버로드할 수 있으므로 클래스 객체의 Operator() 메서드를 호출하는 것이 함수를 호출하는 것처럼 자연스럽습니다.

본질을 분석해 보면 사실 콜백 함수는 함수 시그니처(여러 개의 입력 매개변수, 하나의 출력 매개변수)의 사양입니다. Java에서는 함수 선언이 없지만 인터페이스를 사용하여 사양을 적용할 수 있습니다.


interface Funcable {
  void Func();
}
로그인 후 복사

이런 식으로 인터페이스를 구현하는 클래스에 void Func()와 동일한 함수 시그니처를 가진 멤버 함수가 있는 한(아직은 name 메서드가 익숙하지 않아서) 구현해야 함 이 인터페이스가 있는 클래스의 객체를 함수에 전달한 다음 함수


class F1 implements Funcable {

  @Override
  public void Func() {
    System.out.println("f1()");
  } 
}
public class Test {
  
  public static void do_func(Funcable funcable) {
    funcable.Func();
  } 
  public static void main(String[] args) {
    do_func(new F1());
  }
}
로그인 후 복사

에서 객체의 Func() 메서드를 호출합니다. 여기에서 코드 양을 절약하려면 F2 및 F3 클래스가 쓰지 마세요. 그리고 Java의 익명 클래스를 사용하면 람다 표현식과 유사하게 코드를 저장할 수 있습니다


  do_func(new Funcable() {      
      @Override
      public void Func() {
        System.out.println("f2()");
      }
    });
로그인 후 복사

람다 표현식에 대해 말하면 외부 변수를 캡처할 수 있습니다. Java에서는 익명 생성자를 통해 이 방법을 수행할 수도 있습니다. 외부 변수를 명시적으로 캡처합니다


  String msg = "f3()";
    do_func(new Funcable() {
      String _msg; 
      {
        _msg = msg;
      } 
      @Override
      public void Func() {
        System.out.println(_msg);
      }
    });
로그인 후 복사

이 접근 방식은 람다 식과 매우 유사합니다. 익명 클래스의 익명 생성자는 외부 변수만 생성 매개변수로 사용할 수 있기 때문입니다. 이는 람다 식의 "캡처"와 동일하며 C++에서 람다 식의 해당 작성 방법은 다음과 같습니다.


 std::string msg = "f3()";
  do_func([&msg]() { std::cout << msg << std::endl; });
로그인 후 복사

java8에도 람다 표현이 있어서 이렇게 쓸 수 있어요

do_func(() -> { System.out.println(msg); });
로그인 후 복사

위 내용은 익명 클래스를 사용하여 Java에서 콜백 함수를 구현하는 방법에 대한 설명 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿