Groovy:" def"关键字vs具体类型

时间:2016-11-27 02:06:26

标签: groovy

如果我们知道数据类型并且它不会在运行时更改,我们是否应该定义变量的数据类型或方法的返回类型?有什么利弊或使用def vs实际数据类型?

一个例子是,如果abc是List<String>

List<String> abc = "xyz"; //IntelliJ IDEA gives syntax highlighting for improper assignment
def abc = "xyz"; //IntelliJ IDEA will not give syntax highlighting

2 个答案:

答案 0 :(得分:11)

由于方便(特别是来自Java),很容易陷入在任何地方使用def的陷阱

但是正如你所看到的,如果你知道某种东西的类型,最好输入它,特别是在公共方法上。好处包括;自我记录,ide提示,理智......

答案 1 :(得分:6)

def~ = Object

Tim指出,# imports import requests from bs4 import BeautifulSoup from bs4 import NavigableString # create beautifulsoup object obce_url = 'http://www.e-obce.sk/zoznam_vsetkych_obci.html?strana=2500' source_code = requests.get(obce_url) plain_text = source_code.text obce_soup = BeautifulSoup(plain_text, 'html.parser') # define bs filter def soup_filter_1(tag): return tag.has_attr('href') and len(tag.attrs) == 1 and isinstance(tag.next_element, NavigableString) # print settlement names for tag in obce_soup.find_all(soup_filter_1): print(tag.string) def数据类型的别名,但它可以是一个(Object是一个类虽然Object只是一个Groovy关键字) - http://www.groovy-lang.org/semantics.html#_variable_definition defdef的唯一共同点是,在JVM级别上每个Object语句或类型替换编译为def

考虑非常简单的Object脚本,其中包含以下内容:

test.groovy

如果您将其编译为def name = "John" String surname = "Doe" println "$name $surname" 并查看反编译代码,您将会看到:

test.class

IDE语法支持

如果您使用支持Groovy的IDE(例如IntelliJ IDEA),那么您应该能够使用类型推断,IDE将为您提供语法支持。

Compiled from "test.groovy" public class test extends groovy.lang.Script { public static transient boolean __$stMC; public test(); LocalVariableTable: Start Length Slot Name Signature 4 4 0 this Ltest; public test(groovy.lang.Binding); LocalVariableTable: Start Length Slot Name Signature 0 9 0 this Ltest; 0 9 1 context Lgroovy/lang/Binding; public static void main(java.lang.String...); LocalVariableTable: Start Length Slot Name Signature 0 19 0 args [Ljava/lang/String; public java.lang.Object run(); LineNumberTable: line 1: 4 line 3: 9 line 5: 14 LocalVariableTable: Start Length Slot Name Signature 0 63 0 this Ltest; 7 56 2 name Ljava/lang/Object; 12 51 3 surname Ljava/lang/String; protected groovy.lang.MetaClass $getStaticMetaClass(); } 关键字

的目的

def的主要目的是在Groovy中引入动态类型。正如您在上面的示例中所看到的,这仍然是旧的Java def类型。

好的做法是在有意使用静态类型时使用静态类型。出于文档原因,您的公共API绝对应该使用静态类型。我个人在两种情况下不时使用Object

  • 在范围和变量名称非常有限的局部变量中提供有关变量本身的所有信息
  • 在Spock单元测试中的测试用例名称,例如def