제목이 유감스러운 것은 아마도 너무 일반적인 것입니다.ActionListener 모범 사례
이미 자바로 How to Write an Action Listener 튜토리얼을 읽었는데 이미 this question을 읽었지 만 여전히 몇 가지 의구심이 있습니다. 동일한 작업을 여러 번 수행해야 할 때 가장 좋은 솔루션이 무엇인지 궁금합니다.
동일한 ActionListener
을 재사용하고 싶지만 최선의 방법 (코드 가독성, 코드 mantainability, 성능 및 코드 스타일)에서이를 달성하는 방법을 잘 모르겠습니다.
먼저 (나는 액션 청취자 재사용하지 않을거야 경우 내가 사용하는 것) "표준"코드 :
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
내가 OBV 아무것도를 다시 사용할 수 없습니다이 방법은 내부 익명이기 때문에, 클래스 ... 이제
, 나는 다음과 같은 솔루션을 생각할 수 있습니다 :
- 스토어 필드에 익명의 내부 클래스의 참조 (즉, 가장 가능성이
static final
될 것입니다); ActionListener
인터페이스를 구현하는 새 클래스를 작성하십시오. 솔루션 2public static final MENU_ACTION_LISTENER = new ActionListener() { public void actionPerformed(ActionEvent e) { Navigator.showMenu(); } }; btnMenu.addActionListener(MENU_ACTION_LISTENER);
예제 코드 : 솔루션 1
예제 코드
저장하기 :
// package-private, only GUI-package classes should be able to use it. // most likely I won't ever need to subclass it, so why not making it final? final class MenuActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { Navigator.showMenu(); } } // now, wherever I need to use it: btnMenu.addActionListener(new MenuActionListener());
나는 두 솔루션에 대한 몇 가지 의심이 익명 액션 리스너에 대한 언급? 나는 어떤 종류의 유틸리티 클래스 (예 :
ActionListenersUtil
)를 저장할 수 있습니다. 모든 작업 리스너를 저장하고 싶습니다.static final
필드에서 재사용하고 싶지만, 마음에 들지 않습니다 ... 저를 가난한 디자인으로 보입니다.는 내가 모든 별도의 패키지에 청취자 (예 : GUI 요소에 대한
com.myapp.gui
및com.myapp.gui.listeners
을 가지고 싶습니다 ... 내가 처음에 패키지에 대한 몇 가지 의심을했다 ... 더 의미가 아마 가장 잘 Command Pattern 다음합니다 그러나 내가 이것을 썼을 때 나는 선택의 여지가 없다는 것을 깨달았습니다. 그것이 의미가있는 유일한 장소는 (같은 은이되어야합니다.) 주문을 위해서라도 그것들을 모두 별도의 패키지에 넣어 두는 것이 좋습니다. GUI가 변경된 경우에도 대부분의 작업 수신기가 재사용 될 수 있기 때문에 여전히 의문입니다.
또 다른 질문 : btnMenu.addActionListener(MENU_ACTION_LISTENER);
과 btnMenu.addActionListener(new MenuActionListener());
(JVM, 클래스 로딩, 클래스 컴파일, 각 클래스에서 차지하는 메모리, 가비지 수집 등)의 차이점은 무엇입니까?
도와주세요. 지금 당황하고 있습니다! :(
+1 이렇게하면 여러 통화를하지 않고 '동작'이 연결된 모든 버튼의 텍스트, 아이콘, 사용 가능 상태 및 기타 속성을 변경할 수 있습니다. 또한 메뉴 항목 등에 잘 붙일 수 있습니다. – Brian
+1000 만약 내가 할 수 ... ...-) –
@ 브라이언 아주 좋은 발언. 답변을 복사하여 붙여 넣어 더 완벽하게 만들었습니다. – Robin