![]() |
1
13
我最近一直在读这篇文章,所以(我现在找不到链接,但它是其中之一:“为什么动态语言很好?”博文,S.Lott的一个大回答,有很多评论),答案是: 你可以。在Groovy中,您可以在Java或Groovy中定义接口并实现它们。然而,对于duck类型(groovy允许但也允许显式类型),许多人会说“为什么要麻烦?”源代码是它自己的文档,接口在源代码中,“使用源代码”等。 就我个人而言,这让我疯狂——我喜欢Java给我的编译时间(或真的,开发时间),但这是另一场辩论。如果您使用的是groovy,那是因为您希望编写一个简洁而清晰的代码,这些代码来自duck输入。在这种情况下,除非必要,否则应避免使用接口。 他们需要在哪里?在程序的各个部分之间,以及在程序的公共API中(尽管它们也可以是抽象类)。 否则,我会说你应该尽量避免使用鸭式语言。这迫使你在类上写文档,或者写一些非常清楚的代码,使它们是相同的。 我认为这是一个糟糕的实践,但是这是向动态语言转变的范例的一部分。我认为,如果您避免将接口与实现分离得足够多,那么您将理解它背后的“为什么”。我仍然没有,尽管这与不重复代码(保持干燥)有很大关系。
编辑:
从计算机中获得一些清晰的信息:)不将接口与实现分离的主要原因之一是,您不再依赖于
类型
. 在duck打字中,如你所知,我不在乎它是否是
|
![]() |
2
5
我不熟悉groovy,但一般来说,不需要用松散类型的语言定义接口。
|
![]() |
3
2
定义接口是一种代码文档。通过接口,可以显式声明 期待 从课堂上满足你的需要。 附言:groovy不是我的语言,所以我实际上没有 知道 是否可以在那里定义接口 完全 . |
![]() |
4
1
在某些情况下是的。我有一个例子,我正在创建一个Groovy类,它通过Spring被注入到Java类中。我使用如下的泛型创建了一个接口:
然后,groovy实现如下所示:
我的示例是,我使用JAXB和XJC从XML模式创建对象,并在Jersey RESTful Web服务中使用它们。我正在对Web服务进行版本控制,所做的更改足以实现版本控制,但是仍然有很多代码可以重用。使用接口被证明是有问题的,所以我使用了groovy,并通过duck类型将所有类似的逻辑移动到上面提到的groovy类中。这些对象大部分都是相同的,有些改变,所以在Java类中注入一个接口的鸭子打字工作非常完美。 |