【问题标题】:Groovy: "def" keyword vs concrete typeGroovy:“def”关键字与具体类型
【发布时间】:2017-04-11 01:01:04
【问题描述】:

如果我们知道数据类型并且它不会在运行时改变,我们应该还是不应该定义变量的数据类型或方法的返回类型?使用 def 与实际数据类型的优缺点是什么?

一个例子是,如果 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

【问题讨论】:

标签: groovy


【解决方案1】:

def ~= 对象

正如 Tim 所指出的,def 不是 Object 数据类型的别名,但它可以作为一个(Object 是一个类,而 def 只是Groovy 关键字) - http://www.groovy-lang.org/semantics.html#_variable_definition defObject 唯一的共同点是,在 JVM 级别上,每个 def 语句或类型替换都会编译为 Object

考虑非常简单的test.groovy 脚本,其内容如下:

def name = "John"

String surname = "Doe"

println "$name $surname"

如果你把它编译成test.class,看看反编译后的代码,你会看到:

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

IDE 语法支持

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

def关键字的用途

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

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

  • 在范围和变量名非常有限的局部变量中提供了有关变量本身的所有信息
  • 在测试用例名称中的 Spock 单元测试中,例如def "should do something"() { }

【讨论】:

    【解决方案2】:

    由于方便(尤其是来自 Java 时),很容易陷入到处使用 def 的陷阱

    但是正如您所看到的,如果您知道某物的类型,最好键入它,尤其是在公共方法上。好处包括;自我记录、ide 提示、理智......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2020-04-12
      • 2020-03-15
      相关资源
      最近更新 更多