Groovy: ключевое слово " def " против конкретного типа

должны ли мы или не должны определять тип данных переменной или возвращать тип метода, если мы знаем тип данных, а также он не будет меняться во время выполнения? Каковы плюсы и минусы или использование 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

2 ответов


легко попасть в ловушку использования def везде, из-за удобства (особенно если исходящий из Java)

но, как вы видели, если вы знаете тип, то лучше ввести его, особенно на публичных методов. Преимущества включают; самостоятельная документация, подсказки ide, здравомыслие...


def ~= объект

как указал Тим,def и не это псевдоним Object тип данных, но это может быть как один (Object класс а def - Это просто Ключевое слово Groovy) -http://www.groovy-lang.org/semantics.html#_variable_definition единственное def имеет общую с Object - Это тот факт, что на уровне 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

если вы используете IDE, которая поддерживает Groovy well (например, IntelliJ IDEA), вы должны иметь возможность использовать вывод типа, и IDE предоставит вам синтаксическую поддержку.

цель def ключевое слово

основная цель def это ввести динамические типы в Groovy. Как вы можете видеть в приведенном выше примере, это все еще старая Java Object тип.

рекомендуется использовать статические типы всякий раз, когда вы используете статический тип специально. Ваш общедоступный API должен определенно использовать статические типы по причинам документации. Я лично использую def время от времени в двух случаях:

  • в локальных переменных, которые имеют очень ограниченную область и имя переменной предоставляет всю информацию о переменной сам
  • в модульных тестах Spock в имени тестового случая, например def "should do something"() { }