2017-09-21 11 views
0

메서드 참조를 통해 메서드를 정의하는 방법은 있습니까? 다음 가상 코드 (및 가상 구문)에 의해 설명됩니다.Java 8에서는 메소드 참조를 사용하여 메소드를 정의/구현할 수 있습니까?

class A 
{ 
    public Sometype somefunction(Argtype arg) 
    { ... return somevalue; ..} 
} 

class B 
{ 
    public Sometype method = A::somefunction; 
} 

또는

class C 
{ 
    public Sometype method(Argtype arg) = A::somefunction; 
} 

유사한 기능

은 나에게 매우 유용 보인다. 메서드는 컴파일시에 알 수 있으므로 클래스 B 또는 C의 모든 정의는 간단히 (형식 검사 후) A의 이미 알려진 메서드에 대한 참조를 인수 할 수 있습니다. 장점 : 더 빠른 호출 (새로운 메소드의 직접 호출보다 더 적은 호출) - Java 컴파일러가 최적화하지 않는지 확실하지 않은 곳에서?

Java에서 이미이를 달성 할 수있는 방법이 있습니까? 그렇다면 성공적으로 내 검색을 피했습니다. 아니면 Java에 소개하지 않는 좋은 이유가 있습니까? 비슷한 성능 이점을 제공하는 해결 방법이 있습니까?

추신 : 비슷한 질문 제목이 downvoted 및/또는 닫혔다는 메시지가 나타납니다. 이 내용이 여기에 적용되는 경우 이유를 이해하도록 도와주십시오. 미리 감사드립니다!

+0

데코레이터 사용은 어떻습니까? ? 정확한 유스 케이스를 공유 할 수있는 경우 클래스 A에서 메소드를 정의하고 클래스 B 또는 C에서 동일한 메소드를 호출 할 수 있습니다. 그건 당신의 요구 사항을 취소합니다.더 정확한 답변을 얻을 수 있습니다. – Pramod

+0

성능 이점? 마이크로 최적화에 대한 질문입니까? – Kayaman

+0

'Sometype'은'somefunction'의 리턴 타입입니다. 'B'와'C' 클래스의 필드는'Function '또는 이와 비슷한 것이어야합니다. – dpr

답변

2

이 질문은 2 개의 다른 질문으로 나눌 수 있습니다.

  1. 어떻게 다른 클래스
  2. 내가 자바 상속 살펴보고, 첫 번째와 관련하여 런타임

에서 메서드의 반환 유형을 지정할 수있는 방법

  • , 다형성에서 클래스 A의 방법을 사용할 수 있습니다 , 추상 클래스 및 인터페이스.

    I 클래스 A는 추상적으로 정의했을 :이 방법은 B에서

    class B extends A{ 
    } 
    

    와 C가 구현하는 모든 방법을 상속 할 수있는 :

    abstract class A{ 
        public Sometype somefunction(Argtype arg) 
        { ... return somevalue; ..} 
    } 
    

    을하고 B, C가 확장

    B b = new B(); 
    b.somefunction(arg); 
    

    또한 다음 두 가지 질문을 참조하십시오. 그는 자바 generics를 이용할 수있는 컴파일 타임에이 메소드의 유형을 반환합니다 (다형성이 충분하지 않은 경우).

    abstract class A{ 
        public T somefunction(Class<T> type) 
        { ... return somevalue; ..} 
    } 
    

    을하고 이전 예제 코드가된다 : 이런 식으로 클래스 A는되고 나는 어떤 지점이 표시되지 않습니다 그러나

    class A { 
        public static Sometype someStaticFunction(Argtype aArg) { 
         ... 
        } 
    
        public Sometype someNonStaticFunction(Argtype aArg) { 
         ... 
        } 
    } 
    
    class B { 
        private Function<Argtype, Sometype> mStaticFunction = A::someStaticFunction; 
    
        private Function<Argtype, Sometype> mNonStaticFunction = new A()::someNonStaticFunction; 
    
        public Sometype applyStatic(Argtype aArg) { 
         return mStaticFunction.apply(aArg); 
        } 
    
        public Sometype applyNonStatic(Argtype aArg) { 
         return mNonStaticFunction.apply(aArg); 
        } 
    } 
    

    :

    B b = new B(); 
    b.somefunction(String.class); 
    
  • +0

    이것은 특정 해결 방법이며 (다른 답변과 마찬가지로) 내가 염두에 두었던 것이 Java 언어 사양의 일부가 아니라는 것을 알려줍니다. 그래서 "그 방법에이 방법 설정"옵션이 없습니다. 메서드 테이블 항목에 메서드 참조를 할당하는 간단한 개념이 Java에서는 존재하지 않는다는 사실은 매우 흥미 롭습니다. Java 8에서는이 작업이 쉬울 것으로 보입니다. – BlondMammuth

    2

    은 당신이 뭔가를 할 수 있습니다 이 경우 설계, 성능 또는 기타 측면을 개선해야합니다.

    +0

    사실, 다른 방법을 호출하는 것만으로 쉽게 호출 할 수 있기 때문에 아무런 의미가 없습니다. 하지만 내 질문에 대한 대답은 단순히 "아니, 당신은 클래스 정의에 메소드 참조를 할당 할 수 없다"고 가정합니다. 그래도이 깔끔한 작은 트릭을 염두에 두겠다. 어디에서 유용 할 지 누가 알겠는가? – BlondMammuth