Java Delegates?

2022-08-31 05:57:42

Java 语言是否具有委托功能,类似于 C# 对委托的支持?


答案 1

不是真的,不是。

通过使用反射来获取您可以调用的方法对象,您可以实现相同的效果,另一种方法是使用单个“invoke”或“execute”方法创建一个接口,然后实例化它们以调用您感兴趣的方法(即使用匿名内部类)。

您可能还会发现本文有趣/有用:Java程序员查看C#委托(@blueskyprojects.com)


答案 2

根据您的确切意思,您可以使用策略模式实现类似的效果(传递方法)。

而不是像这样声明命名方法签名的行:

// C#
public delegate void SomeFunction();

声明一个接口:

// Java
public interface ISomeBehaviour {
   void SomeFunction();
}

对于该方法的具体实现,请定义一个实现该行为的类:

// Java
public class TypeABehaviour implements ISomeBehaviour {
   public void SomeFunction() {
      // TypeA behaviour
   }
}

public class TypeBBehaviour implements ISomeBehaviour {
   public void SomeFunction() {
      // TypeB behaviour
   }
}

然后,无论你在 C# 中有什么委托,请改用引用:SomeFunctionISomeBehaviour

// C#
SomeFunction doSomething = SomeMethod;
doSomething();
doSomething = SomeOtherMethod;
doSomething();

// Java
ISomeBehaviour someBehaviour = new TypeABehaviour();
someBehaviour.SomeFunction();
someBehaviour = new TypeBBehaviour();
someBehaviour.SomeFunction();

使用匿名内部类,您甚至可以避免声明单独的命名类,并且几乎将它们视为真正的委托函数。

// Java
public void SomeMethod(ISomeBehaviour pSomeBehaviour) {
   ...
}

...

SomeMethod(new ISomeBehaviour() { 
   @Override
   public void SomeFunction() {
      // your implementation
   }
});

这可能只应该在实现非常特定于当前上下文并且不会从重用中受益时才使用。

当然,在Java 8中,这些确实基本上变成了lambda表达式:

// Java 8
SomeMethod(() -> { /* your implementation */ });

推荐