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)

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

def ~= Объект

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

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

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

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

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