2012-06-12 4 views
3

자바에 많은 관심을 보인 지 몇 년이 지났습니다. 나는 사방이 패턴을보고있다 다시 오는 :전달 된 메소드로 Java 객체 인스턴스화하기

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 
    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 
    // do work 
    } 
}); 

이 나에게 기능 프로그래밍 같은 더 보인다. 그것은 좋은 패턴이지만 어떻게 이런 식으로 전달할 수 있습니까? 예전에는 수업이 수업이었고 컴파일이 끝나면 할 수있는 일이 거의 없었습니다.

내 질문은 :

  1. 은 누구도 날이 패턴이라고 알려 수 있습니까?
  2. 이 방법으로 인스턴스화 할 수있는 클래스를 작성하려면 어떻게해야합니까?
  3. 자바에 기능적 패턴이 유용하게 적용된 예가 있습니까?
  4. 자세히 알아 보려면 Google에 무엇이 필요합니까?

감사합니다.

답변

9

이 메서드는 익명 클래스를 전달하며 메서드는 전달하지 않습니다.

이것은 스윙 프로그래밍뿐만 아니라, 생성하는 대신 인터페이스 (클래스)를 구현하는 대신에 재사용 할 필요가없는 짧은 패턴의 구현을 필요로하는 전형적인 패턴입니다. 본격적인 구현

public class Main { 
    public static void main(String[] args) { 
     System.out.println(new Foo() { 
      public String foo() { 
       return "plugh"; 
      } 
     }); 
    } 
} 

익명 내부 클래스에도 불구하고, 너무, 자신의 수업 파일을 가져 ...

public interface Foo { 
    String foo(); 
} 

:

모든 클래스/인터페이스

은 특별한 아무것도, 다음과 같이 인스턴스화 할 수 소스가 임베드됩니다.

이 예제에서는 Main.class 파일 외에도 익명의 내부 클래스에 대해 Main$1.class 파일이 생성됩니다.

+1

"anonymous inner class"는 유창합니다. :-) OP의 경우, 이들은 처음부터 Java의 일부였습니다. –

+0

아, onRatingChanged는 정적 메서드입니다. 도와 주셔서 감사합니다, 나는 지금 어리 석음을 느낍니다. – superluminary

+0

@superluminary 아니요, 정적 메소드가 아닙니다. 그렇다면 정적 키워드입니다. 정적 메서드는 무시할 수 없으며 숨길 수 있습니다. –

1

진술 : new OnRatingBarChangeListener()은 클래스의 새 인스턴스를 만듭니다. 중괄호 안의 다음 부분은 클래스의 정의입니다.

이 경우 명명 된 인터페이스를 구현하는 익명 클래스의 클래스입니다.

익명 클래스는 이름없이 선언 된 클래스이므로 일반 명명 된 클래스처럼 사용할 수 없습니다.

이 패턴은 거의 사소한 작업을 수행하는 단일 메서드에서 단 몇 개의 메서드 만 포함하는 리스너를 사용할 때 매우 일반적입니다.

0

리스너 패턴입니다. 등급 막대는 OnRatingBarChangeListener의 구현을 취하고 해당 이벤트에서 onRatingChanged 메서드를 호출합니다.

OnRatingBarChangeListener을 구현하는 모든 클래스의 인스턴스를 사용할 수 있습니다. 따라서 네임드 클래스를 사용할 수도 있고, 예제에서와 같이 익명 클래스를 전달할 수도 있습니다. 예제의 익명 클래스는 사실상 Object를 확장하고 OnRatingBarChangeListener를 구현하는 이름없는 클래스입니다.클래스 이름이 지정되지 않았으므로 클래스를 참조 할 수 없으므로 전달 된 인스턴스가 유일한 인스턴스입니다.

0

이것을 "관찰자 패턴"이라고합니다. 이것에 대한 좋은 예는 자바 버튼이나 다른 컴포넌트를위한 액션 리스너를 추가하는 것이다. 예 :

myButton.addActionListener(
       new java.awt.event.ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        //Work here 
       } 
      }); 

여기서 "myButton"은 관찰자입니다.

+0

IMO는 어떤 일이 벌어지고 있는지에 대해 논의하지 않기 때문에 OP의 요점을 놓치고 있습니다. 본질적으로 동일한 예제가 실제로 어떤 것을 설명하는 데 도움이되지 않는다는 것을 보여줍니다. –

관련 문제