익명 클래스에 매개 변수를 전달하거나 외부 매개 변수에 액세스 할 수 있습니까? 예를 들면 다음과 같습니다.
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);