2017-09-21 65 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; 
} 

类似的功能,似乎对我非常有用。方法在编译时已知,因此类BC中的任何定义可能只是(在类型检查后)接管对A中已知方法的引用。优点:更快的调用(比直接调用新方法所需的调用更少) - 我不确定Java编译器是否不会优化?

现在有没有办法在Java中实现它(如果是的话,它已经成功地避开了我的搜索)?或者有没有很好的理由不把它引入到Java?有没有提供类似性能优势的解决方法?

PS:我收到类似问题标题已被降低和/或关闭的消息。如果这也适用于此,请帮助我理解原因。提前致谢!

+0

怎么样使用装饰。 ? 您可以在A类中定义该方法,并调用B类或C类的相同方法。 如果您可以分享您的确切用例。这将清除您的要求。并且您可能会得到更准确的答案 – Pramod

+0

性能优势?这是一个关于微观优化的问题吗? – Kayaman

+0

'Sometype'是'somefunction'的返回类型。类“B”和“C”中的字段必须是“Function ”或类似的类型。 – dpr

回答

2

这个问题可以分成2个不同的问题。

  1. 我如何使用A类方法从其他类
  2. 我怎么能在运行时指定

的方法的返回类型对于第一个,看看Java继承,多态,抽象类和接口。

我会定义A类为抽象:

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

和B,C扩展它:

class B extends A{ 
} 

这样B和C继承了一个实现的所有方法,你可以执行这样的事情:

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

此外,如果您不知道第二个问题他在编译时返回此方法的类型,您可以利用java泛型(如果多态性不够)。这样A级变为:

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

和上面的示例代码变为:

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

这是一个特定的解决方法,并且(和其他答案一样),它告诉我我脑海中所想的不是Java语言规范的一部分。所以没有“将该方法设置为该方法”选项。 真的很有意思的是,在Java中没有分配(匹配)方法引用方法表项的简单概念,尽管从Java 8开始这似乎很容易。 – BlondMammuth

2

你可以做这样的事情:

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); 
    } 
} 

但是我看不出任何一点在此,重新设计,性能或任何其他方面。

+0

确实没有意义,因为调用另一种方法很容易就可以实现。但我认为我的问题的答案只是“不,你不能在定义方法引用类方法”。 不过,我会牢记这个整洁的小窍门,谁知道它可能派上用场? – BlondMammuth

相关问题