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