[java] 익명 클래스에 매개 변수를 전달하는 방법은 무엇입니까?

익명 클래스에 매개 변수를 전달하거나 외부 매개 변수에 액세스 할 수 있습니까? 예를 들면 다음과 같습니다.

int myVariable = 1;

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // How would one access myVariable here?
    }
});

리스너가 실제 이름 지정된 클래스로 리스너를 작성하지 않고 myVariable에 액세스하거나 myVariable에 전달할 수있는 방법이 있습니까?



답변

익명 클래스는 생성자를 가질 수 없기 때문에 기술적으로는 아닙니다.

그러나 클래스는 범위를 포함하여 변수를 참조 할 수 있습니다. 익명 클래스의 경우 포함 클래스의 인스턴스 변수 또는 final로 표시된 로컬 변수 일 수 있습니다.

편집 : Peter가 지적했듯이 매개 변수를 익명 클래스의 수퍼 클래스 생성자에게 전달할 수도 있습니다.


답변

예, ‘this’를 반환하는 초기화 메소드를 추가하고 즉시 해당 메소드를 호출하면됩니다.

int myVariable = 1;

myButton.addActionListener(new ActionListener() {
    private int anonVar;
    public void actionPerformed(ActionEvent e) {
        // How would one access myVariable here?
        // It's now here:
        System.out.println("Initialized with value: " + anonVar);
    }
    private ActionListener init(int var){
        anonVar = var;
        return this;
    }
}.init(myVariable)  );

‘최종’선언이 필요하지 않습니다.


답변

예. 내부 클래스에서 볼 수있는 변수를 캡처 할 수 있습니다. 유일한 한계는 그것이 최종적 이어야한다는 것입니다


답변

이처럼 :

final int myVariable = 1;

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // Now you can access it alright.
    }
});


답변

이것은 마술을 할 것입니다

int myVariable = 1;

myButton.addActionListener(new ActionListener() {

    int myVariable;

    public void actionPerformed(ActionEvent e) {
        // myVariable ...
    }

    public ActionListener setParams(int myVariable) {

        this.myVariable = myVariable;

        return this;
    }
}.setParams(myVariable));


답변

http://www.coderanch.com/t/567294/java/java/declare-constructor-anonymous-class에 표시된 것처럼 인스턴스 이니셜 라이저를 추가 할 수 있습니다. 이름이없고 생성자와 마찬가지로 먼저 실행되는 블록입니다.

왜 Java 인스턴스 초기화 프로그램인가? 에서 논의 된 것처럼 보입니다 . 인스턴스 이니셜 라이저는 생성자어떻게 다릅니 까? 생성자와의 차이점에 대해 설명합니다.


답변

내 솔루션은 구현 된 익명 클래스를 반환하는 메서드를 사용하는 것입니다. 정규 인수는 메소드에 전달 될 수 있으며 익명 클래스 내에서 사용 가능합니다.

예를 들면 다음과 같습니다 (일부 GWT 코드에서 텍스트 상자 변경 처리).

/* Regular method. Returns the required interface/abstract/class
   Arguments are defined as final */
private ChangeHandler newNameChangeHandler(final String axisId, final Logger logger) {

    // Return a new anonymous class
    return new ChangeHandler() {
        public void onChange(ChangeEvent event) {
            // Access method scope variables           
            logger.fine(axisId)
        }
     };
}

이 예제에서 새로운 익명 클래스 메소드는 다음과 같이 참조됩니다.

textBox.addChangeHandler(newNameChangeHandler(myAxisName, myLogger))

또는 OP의 요구 사항을 사용하여 :

private ActionListener newActionListener(final int aVariable) {
    return new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Your variable is: " + aVariable);
        }
    };
}
...
int myVariable = 1;
newActionListener(myVariable);