Java代表?

新手上路,请多包涵

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

原文由 markus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 533
2 个回答

不是真的,不。

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

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

原文由 Matt Sheppard 发布,翻译遵循 CC BY-SA 4.0 许可协议

完全取决于您的意思,您可以使用策略模式实现类似的效果(传递方法)。

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

 // 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# 中有一个 SomeFunction 委托,都使用 ISomeBehaviour 引用代替:

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

原文由 Dave Cousineau 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题