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