2017-12-08 13 views
0

익명 개체를 만들고 어딘가에 저장하는 메서드가 있다고 가정 해 봅니다. 이 익명 객체는 매개 변수로 전달 된 메서드에서 람다를 호출합니다.매개 변수로 전달 된 람다에서 익명 클래스의 다른 메서드에 액세스

public class myCallBackManager { 

    private List<MyCallBack<?>> callBackList = new LinkedList<MyCallBack<?>>(); 

    public <T> void addCallBack(Consumer<MyCallBack<T> onCall, Runnable something){ 
     callBackList.add(new MyCallback<T>() { 
      @Override 
      protected void call(MyCallback<T> callback) { 
       onCall.accept(callback); 
      } 
      @Override 
      protected void doSomething() { 
       something.run()); 
      } 
     } 
    } 

    public void runAll() { 
     for (MyCallback<?> myCallback : callBackList) { 
      myCallback.call(); 
     } 
    } 
} 

이 개체는 내부적으로 개체를 저장하고 나중에 모두 실행되도록 요청합니다.

하지만,이를 추가 할 :

public static void main(String[] args) { 

    Runnable someRunnable =() -> System.out.println("Doing something"); 

    MyCallBackManager myCallBackManager = new MyCallbackManager(); 
    myCallBackManager.<SomeObject> addCallback(
      (callback) -> { 
       doSomething(); // WON'T WORK 
       System.out.println(callback.toString()); 
      }, 
      someRunnable 
    }; 

    myCallBackManager.runAll(); 

} 

을 여기에, 나는) 해봐요을 (전화 애 쓰고 onCall 람다에서이 익명 함수의 호출()에 의해 실행되는 것처럼 그대로 라는. 문제는, 내가 존재하지 않는 객체에 핸들이 없기 때문에,이 메소드가 호출 될 수 없다는 것입니다. 람다에서 doSomething()을 호출하는 방법이 있습니까?

doSomething() 메서드에 액세스하려고 시도하는 대신 someRunnable.run()을 호출하는 것과 같은 특별한 경우에 대한 해결 방법이 있지만이 메서드를 대신 호출하는 방법을 특히 요구하고 있습니다.

+0

당신은 당신의 코드에서 몇 가지 이상한 일들이'MyCallback'와'MyCallBack','MyCallBack' 원시 형,'MyCallBackManager myCallBackManager = 새로운 MyCallbackManager로서'-하는 유효하지 않습니다. 이게 진짜 코드인가요? –

+0

@ MCEmperor 아니요, 제 실제 코드에는 더 많은 것들이 있습니다. 나는 관련성이 높은 것들을 유지하려고 노력했습니다. 제네릭을 사용하고 있으므로 원시 타입이 없습니다. 나는 그것을 편집 할 것이다. 또한 인스턴스화를위한 oops, 좋은 잡기. – Eth

+0

이에 따라 질문을 편집해야합니다. 예를 들어, 당신이'MyCallback' 클래스의 소스를 제공하지 않았기 때문에, 당신이 원하는 것이 명확하지 않습니다. 나는 어떻게 든 당신이 비교적 간단한 작업을 위해 복잡한 것을 가지고 있다는 느낌을 받았습니다. –

답변

0

이것은 하나의 해결책입니다. 너 정말로 무엇을하려고하는거야?

import java.util.LinkedList; 
import java.util.List; 
import java.util.function.Consumer; 

public class Test { 

    public static class MyCallback<T> { 

     public void call() { 
      System.out.println("Test.MyCallback.call()");   
     } 

     protected void call(MyCallback<?> callback) { 
      System.out.println("Test.MyCallback.call(MyCallback<?>)");   
     } 

     protected void doSomething() { 
      System.out.println("Test.MyCallback.doSomething()");    
     } 

    } 

    static public class CallBackManager { 

     private List<MyCallback<?>> callBackList = new LinkedList<>(); 

     public void addCallBack(Consumer<MyCallback<?>> onCall, Runnable something){ 
      callBackList.add(new MyCallback<Object>() { 
       @Override 
       protected void call(MyCallback callback) { 
        onCall.accept(callback); 
       } 
       @Override 
       protected void doSomething() { 
        something.run(); 
       } 
      } 
        ); 
     } 

     public void runAll() { 
      for (MyCallback<?> myCallback : callBackList) { 
       myCallback.call(); 
      } 
     } 
    } 

    public static void main(String[] args) { 

     Runnable someRunnable =() -> System.out.println("Doing something"); 

     CallBackManager myCallBackManager = new CallBackManager(); 
     myCallBackManager.addCallBack(
       (MyCallback<?> callback) -> { 
        callback.doSomething(); // WON'T WORK 
        System.out.println(callback.toString()); 
       }, 
       someRunnable 
       ); 

     myCallBackManager.runAll(); 

    } 

} 

당신이 (Runnable를 소비자>) Test.CallBackManager.addCallBack에 onCall를 사용하지 않을 어쩌면 그 또한 문제입니다.

또는이 시도됩니다

import java.util.LinkedList; 
import java.util.List; 
import java.util.function.Consumer; 

public class Test { 

    public static class MyCallback<T> { 

     public void call() { 
      System.out.println("Test.MyCallback.call()");   
     } 

     protected void call(MyCallback<?> callback) { 
      System.out.println("Test.MyCallback.call(MyCallback<?>)");   
     } 

     protected void doSomething() { 
      System.out.println("Test.MyCallback.doSomething()");    
     } 

     @Override 
     public String toString() { 
      System.out.println("Test.MyCallback.toString()");   
      return "[CLASS Test.MyCallback<T>]"; 
     } 

    } 

    static public class CallBackManager { 

     private List<MyCallback<?>> callBackList = new LinkedList<>(); 

     public void addCallBack(Consumer<MyCallback<?>> onCall, Runnable something){ 
      callBackList.add(new MyCallback<Object>() { 
       @Override 
       protected void call(MyCallback callback) { 
        onCall.accept(callback); 
       } 
       @Override 
       protected void doSomething() { 
        something.run(); 
       } 
      } 
        ); 
     } 

     public void runAll() { 
      for (MyCallback<?> myCallback : callBackList) { 
       myCallback.call(); 
       myCallback.call(myCallback);//OR THIS? 
      } 
     } 
    } 

    public static void main(String[] args) { 

     Runnable someRunnable =() -> System.out.println("Doing something"); 

     CallBackManager myCallBackManager = new CallBackManager(); 
     myCallBackManager.addCallBack(
       (MyCallback<?> callback) -> { 
        callback.doSomething(); // WON'T WORK 
        System.out.println(callback.toString()); 
       }, 
       someRunnable 
       ); 

     myCallBackManager.runAll(); 

    } 

}