2017-10-13 3 views
0

자바 JFrame에서 메뉴를 만드는 중입니다. 같은 클래스에서 서로 다른 이벤트에 대해 서로 다른 응답을하는 두 가지 방법을 보았습니다. https://stackoverflow.com/a/10472395/5960074어떤 수업에서 여러 행동을하는 것이 더 낫습니까? actionPerformed()의 익명 내부 클래스 또는 if 문?

public static void createMenuBar() 
{ 
    //Main Menu Items 

    menubar.add(fileMenu); 
    MainWindow.window.setJMenuBar(menubar); 

    //Sub menu items 
    saveItem = new JMenuItem("Save"); 
    loadItem = new JMenuItem("Load"); 

    //Add to the "File" menu item 
    fileMenu.add(saveItem); 
    fileMenu.add(loadItem); 

    //Anonymous Inner classes for actionListeners 


    //Action event for saving 
    saveItem.addActionListener(new ActionListener(){ //adding the listener 
     @Override 
     public void actionPerformed(ActionEvent e){ //creating the specific action for save 
      System.out.println("You tried to save."); 
     } 
    }); 

} 

를 내 코드는 다음과 같습니다과이 시점에서 같이 (작동에서는 당신은 저장하려고 "인쇄 : 몇 년 전부터이 답변에 설명 된대로 하나는 익명의 내부 클래스를 사용하는 것입니다 . "콘솔에).

다른 사람들이 클래스에서 ActionListener를 구현 한 다음 actionPerformed() 메소드에서 이벤트 원본을 추적하는 if 문을 사용하는 것을 보아 왔습니다. 따라서 이벤트가 하나 있지만 이벤트를 트리거하는 코드가 변경됩니다.

첫 번째 방법은 어수선하고 두 번째 방법은 읽기 쉽습니다. 두 번째 방법보다 첫 번째 방법을 사용해야하는 이유가 있습니까?

감사합니다.

+1

대답은, 둘 다 아니며 둘 다입니다. 그것은 필요에 따라 내려갈 것입니다. 'Action' API는 재사용 가능한 코드 블록을 생성하는 또 다른 방법입니다 – MadProgrammer

+0

왜 다른 사람이 더 잘 작동하는지 이유를 생각해 볼 수 있습니까? 사용자가 데이터를 저장하고로드 할 수있는이 클래스가있는 메뉴 모음을 설정하려고합니다. – admiralmattbar

+1

"더 나은"의견을 구하는 것이 무엇입니까. 다양한 스타일을 적용하고 가독성에 영향을 미치는 방식과 스타일을 전환 할 때를 경험하십시오. –

답변

1

익명이 아닌 클래스와 함께 Action 클래스를 사용합니다 (정적 인 내부 클래스 일 수 있음). 좋은 캡슐화를 제공하고 코드를 읽을 수있게 만들고 ActionListener을 사용하는 것보다 여러면에서 더 낫습니다.

1

먼저, static을 사용하지 마십시오. 정말로 필요하지 않습니다. 나쁜 코드 디자인을 촉진합니다. 당신을 가정

람다의를 사용하여 자바 8을 사용하고 :

public void createMenuBar() { 
    ... 
    saveItem.addActionListener(this::save); 
    loadItem.addActionListener(this::load); 
} 

private save(ActionEvent e) { 
    .... 
} 

private load(ActionEvent e) { 
    .... 
} 

당신이 인터페이스를 구현하고 if 문을 사용하는 것보다 더 나은 내부 클래스를 사용하여 람다를 사용할 수없는 경우.

public class MyGui { 
    private class SaveAction implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      .... 
     } 
    } 

    private class LoadAction implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      .... 
     } 
    } 

public void createMenuBar() { 
    ... 
    saveItem.addActionListener(new SaveAction()); 
    loadItem.addActionListener(new LoadAction()); 
} 
} 
+0

답장을 보내 주셔서 감사합니다. 나는 main 메소드에서이 메소드를 호출했지만 지금은 그렇지 않으며 정적을 제거하는 것을 잊었다. 특히, 코드에서 정적을 사용하는 것에 대해 나쁜 점은 무엇입니까? – admiralmattbar

+1

나는 '정적 인'모든 문제를 설명 할 범위가 없다고 생각합니다. 그러나'main' 함수에서'new MyGui(). show()'와 같이 sth를 쓰고'show()'메소드에서 gui를 만들고 표시하십시오. 문제가 생기면 새로운 문제가 생길 수 있습니다. –

+1

@admiralmattbar 정적이 나쁜 습관으로 간주되는 이유는 많이 있습니다. 전역 변수에 대한 연구를 해보십시오. 하나의 문제는 쓰기 제어를 허용하지 않기 때문에 프로그램의 다른 부분에서 참조를 변경할 수 있고 갑자기 예측할 수없는 동작이 발생할 수 있다는 것입니다. 또한 핵심 요소를 결합하여 재사용 가능성을 줄이고 확장을 제한합니다. – MadProgrammer

관련 문제