2012-05-18 4 views
4

내가하고 싶은 것은 실제 메서드 개체를 다른 메서드로 쉽게 전달하는 것입니다. 그래서 메서드를 나타내는 문자열을 전달할 위험없이 객체 목록의 지정된 메서드에 조인하는 일반 Joiner 함수를 만들 수 있습니다. 내가 좋아하는 구문을 가질 수 있도록 자바에서이 가능 :실제 메소드를 Java의 다른 메소드에 매개 변수로 전달하는 방법은 무엇입니까?

joinOnMethod(String, Collections<T>, Method) e.g. 
joinOnMethod(", ", someList, T.getName()) 
T.getName는() 대신의 반환 형식을 전달 목록에있는 각 개체에 호출에 getName() 메소드를 통과

메서드 자체. 이 내 요구에 충분히 분명하다

희망,

알렉세이 블루.

답변

6

Java에서 직접 일류 함수 지원이 없습니다.

public interface Function<In, Out> { 
    Out apply(In input); 
} 

그럼 당신은 사용할 수 있습니다 : 두 가지 옵션 :이

  • 과 같이 하나의 멤버 타입을 만들기에

    메소드의 이름에서
    • 패스, 사용 반사 얻을 수 이 같은 익명의 내부 클래스 : 당신이 변수로 그 기능을 추출 할 수 있습니다 물론

      joinOnMethod(", ", someList, new Function<T, String>() { 
             @Override public String apply(T input) { 
              return input.getName(); 
             } 
            }); 
      

      :

      private static Function<T, String> NAME_EXTRACTOR = 
          new Function<T, String>() { 
           @Override public String apply(T input) { 
            return input.getName(); 
           } 
          }; 
      
      ... 
      
      joinOnMethod(", ", someList, NAME_EXTRACTOR); 
      
  • +5

    운전 기사 downvoter :이 답변에 잘못되었다고 생각하는 설명을 남겨주세요. 나는 당신이 유효한 점을 가지고 있다면 존이 그의 대답을 향상시킬 것이라고 확신한다. 그러나 대부분의 경우, 오해가 설명되는 데 도움이됩니다. –

    +0

    훌륭한 답변 Jon (자바에 관한 모든 질문에 대답하는 것처럼 보입니다 ^. ^). 이것은 좋겠지 만, 코드베이스가 거대한 롤인 것처럼 각 메소드에 대해 수천 가지를 생성하게 될 것입니다. 나는 자바가 어떤 점에서 이것을 지원할 수 있기를 바란다 : –

    +0

    @AlexeiBlue : Java 8이 더 많은 지원을 할 것이나, 생각할 수있는만큼 이것을 필요로하지 않을 것이라고 생각할 것이다. 이러한 기능을 제공하는 일반적으로 액세스가 가능한 읽기 전용 필드를 많이 선택하면 도움이 될 것입니다. –

    1

    Java에서 명령 패턴을 연구하는 것이 좋습니다. 콜백 기능을 지원합니다.

    http://en.wikipedia.org/wiki/Command_pattern#Java

    +0

    다른 언어에는 * 함수 포인터 * 또는 * 대리자 *가있는 반면 Java는 인터페이스 구현을 통해이를 처리합니다. –

    +0

    나는 C의 함수 포인터보다 인터페이스를 다루겠다. 이 얼마나 악몽인가. 대의원은 다소 훌륭합니다. – jn1kk

    +0

    함수 포인터에 대해 불편을 끼쳐 드려 죄송합니다. 인터페이스는 함수 포인터의 테이블 일뿐입니다. 모든 방법이 필요하다면 언어 지원이 좋습니다.그러나 단일 함수의 경우 인터페이스를 정의한 다음이를 구현하는 클래스를 정의하는 데는 어색함이 있습니다. –

    1

    난 그냥 자바 스크립트 또는 개체로 기능을 처리하는 다른 언어에서 자바로 이동했습니다 내기. 내 지식으로는 자바가 함수를 객체로 취급하지 않기 때문에 가능하지 않습니다. 실제로 루프 또는 다른 구조로 for으로 작성해야합니다.

    +0

    아니요 방금 Javascript LOL에서 옮겨 본 것이 아니라이 개념을 가진 noobie입니다. 어쨌든 대답 해 주셔서 감사합니다 :) –

    +0

    괜찮습니다. Java에서 Javascript로 옮겼습니다. 매개 변수로 함수를 전달한다는 아이디어가 저를 멀리 떨어 뜨 렸습니다. 응답하지 않았다하더라도 도움이된다면 답을 +1하는 것을 잊지 마십시오. – SomeKittens

    +0

    문제 없습니다 +.^ –

    1

    아니, 그런 어떤 구문이 없습니다. 또한 유형 지우는 때문에 실제 유형 T은 런타임에 사용할 수 없으므로 구문을 사용할 수있는 경우에도 일반 내부에서는 가능하지 않습니다.

    joinOnMethod(String separator, Collections<T> items, String methodName, Class<T> theClass) 
    

    는 이제 방법 methodName의 클래스를 조회 할 수 있으며, 계산에이 방법을 사용하십시오

    비결은 다른 매개 변수와 함께 Class<T>를 전달하고, 방법을 얻기 위해 반사를 사용하는 것입니다. 이렇게하면 문자열을 전달하는 데 도움이되지 않습니다. 즉, 메소드가 존재하지 않으면 컴파일러가 오류를 트리거하지 않지만 유형 삭제에도 불구하고 제네릭을 사용할 수 있습니다.

    +1

    그건 내가 불행히도 즉, 메서드 이름을 String으로 전달하는 것을 피하고 싶었던 비트입니다. 그것은 리플렉션을 사용할 때 위험 할 수 있습니다. 리팩토링 툴은 이것을 선택하지 않으므로 클래스의 이름을 변경합니다./나는 이것을 위해 영리한 것을 생각해야합니다 :) –

    관련 문제