2016-08-27 3 views
0

정적으로 입력 된 언어에 대해서는 뭔가 빠져 있다고 생각합니다. 필자가 펄 방법을 사용했을 때, 호출 할 함수가 무엇인지 말할 수있는 많은 방법이있었습니다.메소드 참조를 객체 생성자에 전달

는 지금은 자바에있어 것을, 나는 쉽게 FASION

나는 일반적인 Button 클래스가 비슷한 일을 할 수있는 방법을 볼 실패합니다. 이것은 사용될 실제 버튼의 하위 클래스입니다. 클릭 할 때마다 다른 메소드를 사용합니다.

클릭했을 때 호출 할 메소드에 대한 참조를 전달할 방법이 없으므로 모든 버튼에 대해 하나의 클래스를 사용할 수 있습니까? 현재

, 나는 다음과 같은 버튼을 만들 :

// Specifically using the subclass that sets "firemode" to "close" 
FiremodeClose fc = new FiremodeClose(Settings.ui_panel_start, Settings.ui_panel_row_firemode, game); 
painter.addSelectionButton(fc); 
clickTracker.addSelectionButton(fc); 

이 당연히이 서브 클래스의 무수한 만 배치, 라벨/그래픽 및 메서드 호출에 다른 각을 couses. 그것은 다음과 비슷한 일을하는 것이 더 의미가 있습니다 :

// Generic button, the method that sets "firemode" is somehow passed as arguement to the contsructor. 
Button fc = new Button(&referenceToFunctionToCallWhenClicked, otherArguementsEtc); 
painter.addSelectionButton(fc); 
clickTracker.addSelectionButton(fc); 

내가 말했듯이, 따라서 저 멀리 점점시키는,이를 달성하는 방법이되어야한다는 의미가 있기 때문에, 내가 모르는 뭔가가 있어야합니다 느낀다 하나의 서브 클래스가없는 하나의 Button 클래스.

class MyButton { 
    private final Runnable action; 

    public MyButton(Runnable action) { 
     this.action = action; 
    } 
    ... 
} 

을 그리고 버튼을 클릭하면 다음 action.run() 전화 :

+2

이것은 인터페이스의 용도입니다. Java 8과 Groovy는 이처럼 간단한 사용 사례를위한 인라인 인터페이스 구현을 만듭니다. – chrylis

+0

^^^ 그리고 익명의 수업도 참조하십시오. –

+0

@chrylis 그것이 인터페이스가 필요한 경우, 의도 한 용도 이외의 용도로 사용했을 것입니다. 나는 이것을위한 몇 가지 코드 예제와 관련된 답변을보고 싶다. – Jarmund

답변

1

그것이 인터페이스가 필요한 경우, 의도 한 용도 이외의 용도로 사용했을 것입니다. 나는 이것을위한 몇 가지 코드 예제와 관련된 답변을보고 싶다.

을 가지고 당신의 Buttons 단지 Swing does처럼 observer pattern를 구현합니다. 그러면 Swing의 ActionListener 인터페이스를 사용하거나 심지어 Runnable을 사용할 수도 있습니다. 자신을 굴려 라.

// Your interface. 
public interface MyButtonListener { 
    public void buttonClicked(); 
} 

// Somewhere else: 
Button fc = ...; 
fc.addButtonListener(new MyButtonListener() { 
    @Override public void buttonClicked() { 
     // do stuff here 
    } 
}); 

// And in your Button have it simply iterate through all of its registered 
// MyButtonListeners and call their buttonClicked() methods. 

다른 방법으로 구현할 수 있습니다.

theOneButton = new Button(theUI, ...); 
theOtherButton = new Button(theUI, ...); 

또는 그 (것)들이 : 버튼을 만들 때

public class MyUI implements ThingThatCaresAboutButtons { 
    @Override public void buttonClicked (Button button) { 
     if (button == theOneButton) { 
      // do whatever 
     } else if (button == theOtherButton) { 
      // do whatever 
     } 
    } 
} 

그리고 그런 다음 당신의 높은 수준의 UI 로직을 가지고 뭔가를

public interface ThingThatCaresAboutButtons { 
    public void buttonClicked (Button button); 
} 

수 : 예를 들어, 당신도 뭔가를 할 수 생성자에서 전달 된 단일 객체 대신 목록을 유지 관리합니다. 또는 무엇이든.

끝내지 않는 방법으로이 고양이를 피할 수 있지만 여기에 영감을 얻으시기 바랍니다. Swing의 작동 방식을 확인하십시오.

1

당신은 예를 들어 Runnable를 사용할 수 있습니다.

버튼을 만들 때 void 반환 유형이 있고 인수가없는 경우 reference to a method을 전달할 수 있습니다.

Button fc = new Button(EnclosingClass::methodToCall, otherArguementsEtc); 

다른 인터페이스를 다른 메소드 서명에 사용할 수 있습니다. 당신이 방법 참조 및 람다 모두 사용할 수있는 Java 8에서

1

: 당신은 자바 < 8 비슷한 일을 할 수

class Button { 
    Button(Runnable function) { 
    } 
} 
Button b1 = new Button(() -> System.out.println("works!")); 
Button b2 = new Button(System::gc); 

을하지만, 익명 클래스와 더 자세한입니다 :

Button b3 = new Button(new Runnable() { 
    @Override 
    public void run() { 
     System.out.println("works!"); 
    } 
});