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"() { }