update
parent
73b780d833
commit
2834cfe6e1
|
@ -1,6 +1,7 @@
|
||||||
## Klassen
|
# Klassen
|
||||||
|
|
||||||
|
### Definition einer Klasse
|
||||||
|
|
||||||
- Definition einer Klasse
|
|
||||||
|
|
||||||
Klassen in Groovy werden ähnlich wie in Java definiert, jedoch mit einigen
|
Klassen in Groovy werden ähnlich wie in Java definiert, jedoch mit einigen
|
||||||
syntaktischen Erleichterungen
|
syntaktischen Erleichterungen
|
||||||
|
@ -13,7 +14,7 @@ Beispiel
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Eigenschaften
|
### Eigenschaften
|
||||||
|
|
||||||
Eigenschaften können direkt als Felder definiert werden. Groovy
|
Eigenschaften können direkt als Felder definiert werden. Groovy
|
||||||
generiert automatisch Getter- und Setter-Methoden (wie in Ruby)
|
generiert automatisch Getter- und Setter-Methoden (wie in Ruby)
|
||||||
|
@ -63,7 +64,7 @@ static void(args) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Konstruktoren
|
### Konstruktoren
|
||||||
|
|
||||||
Groovy fügt automatisch einen Standardkonstruktor hinzu. Man kann auch
|
Groovy fügt automatisch einen Standardkonstruktor hinzu. Man kann auch
|
||||||
benutzerdefinierte Konstruktoren definieren.
|
benutzerdefinierte Konstruktoren definieren.
|
||||||
|
@ -79,16 +80,18 @@ class Person {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Standardkonstruktor mit Map
|
### Standardkonstruktor mit Map
|
||||||
|
|
||||||
Groovy bietet eine spezielle Initialisierungsform mit einer Map an
|
Groovy bietet eine spezielle Initialisierungsform mit einer Map an
|
||||||
```
|
```
|
||||||
Person person = new Person(name: 'John', age: 30)
|
Person person = new Person(name: 'John', age: 30)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Methoden
|
# Methoden
|
||||||
|
|
||||||
- Definition einer Methode
|
### Definition einer Methode
|
||||||
|
|
||||||
Methoden werden ähnlich wie in Java definiert, können aber optional einen Rückgabetyp
|
Methoden werden ähnlich wie in Java definiert, können aber optional einen Rückgabetyp
|
||||||
haben
|
haben
|
||||||
|
@ -121,7 +124,7 @@ sum(5,2)
|
||||||
// 7
|
// 7
|
||||||
```
|
```
|
||||||
|
|
||||||
- Instanzmethoden
|
### Instanzmethoden
|
||||||
|
|
||||||
Methoden können Instanzmethoden sein und auf Instanzvariablen zugreifen.
|
Methoden können Instanzmethoden sein und auf Instanzvariablen zugreifen.
|
||||||
```
|
```
|
||||||
|
@ -138,7 +141,7 @@ def myMethod() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Statische Methoden
|
### Statische Methoden
|
||||||
```
|
```
|
||||||
class MathUtils {
|
class MathUtils {
|
||||||
// Definition einer statischen Methode
|
// Definition einer statischen Methode
|
||||||
|
@ -154,7 +157,7 @@ class MathUtils {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Dynamische Methoden
|
### Dynamische Methoden
|
||||||
|
|
||||||
Groovy erlaubt es, Methoden zur Laufzeit hinzuzufügen.
|
Groovy erlaubt es, Methoden zur Laufzeit hinzuzufügen.
|
||||||
In diesem Beispiel wird die Methode sayHello zur Klasse DynamicExample hinzugefügt, nachdem
|
In diesem Beispiel wird die Methode sayHello zur Klasse DynamicExample hinzugefügt, nachdem
|
||||||
|
@ -171,11 +174,10 @@ def example = new DynamicExample()
|
||||||
example.sayHello()
|
example.sayHello()
|
||||||
```
|
```
|
||||||
|
|
||||||
- Expando
|
### Expando
|
||||||
|
|
||||||
|
Expando ist eine spezielle Klassen in Groovy, die ermöglicht, Objekten zur Laufzeit dynamisch Methoden und Eigenschaften hinzuzufügen. Dadurch ist die vorherige Deklaration der Felder in der Klasse nicht nötig
|
||||||
|
|
||||||
Ist eine spezielle Klassen in Groovy, die ermöglicht Objekten zur Laufzeit dynamisch
|
|
||||||
Methoden und Eigenschaften hinzuzufügen. Dadurch ist die vorherige Deklaration der Felder
|
|
||||||
in der Klasse nicht nötig
|
|
||||||
|
|
||||||
Beispiel
|
Beispiel
|
||||||
```
|
```
|
||||||
|
@ -192,9 +194,9 @@ expando.sayHello = { -> println "Hello from $name" }
|
||||||
expando.sayHello() // Ausgabe: Hello from Groovy
|
expando.sayHello() // Ausgabe: Hello from Groovy
|
||||||
```
|
```
|
||||||
|
|
||||||
- Default-Parameterwerte
|
### Default-Parameter
|
||||||
|
|
||||||
Methodenparameter können Standdardwerte haben(wie in Ruby)
|
Methodenparameter können Standdardwerte haben(wie in Ruby). Diese werden eingesetzt, falls beim Aufruf keine Parameter gesetzt werden.
|
||||||
|
|
||||||
Beispiel 1
|
Beispiel 1
|
||||||
```
|
```
|
||||||
|
@ -217,29 +219,43 @@ sum()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
- Closures
|
### Closures
|
||||||
|
|
||||||
Closures können auf Variablen aus ihrem umgebenden Gültigkeitsbereich zugreifen und diese
|
Closures können auf Variablen aus ihrem umgebenden Gültigkeitsbereich zugreifen und diese
|
||||||
„einfangen“. Dadurch können sie auf Werte zugreifen, die zum Zeitpunkt ihrer Erstellung
|
„einfangen“. Dadurch können sie auf Werte zugreifen, die zum Zeitpunkt ihrer Erstellung
|
||||||
existierten.
|
existierten.
|
||||||
|
Closures enthalten Parameter, den Pfeil -> und den auszuführenden Code. Parameter sind
|
||||||
|
optional und werden, sofern abgegeben, durch Kommas getrennt.
|
||||||
|
|
||||||
1. Parameter
|
1. Parameter
|
||||||
```
|
```
|
||||||
|
//closure takes one parameter - name - and prints it when invoked
|
||||||
|
|
||||||
def greet = { String name -> println "Hello, $name!" }
|
def greet = { String name -> println "Hello, $name!" }
|
||||||
greet.call("John")
|
greet.call("John")
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Referenzierung von Variablen und Rückgabewerte
|
2. Referenzierung von Variablen und Rückgabewerte
|
||||||
|
Dieses Beispiel zeigt, wie Closures auf Variablen im auf Variablen im umgebenden Kontext
|
||||||
|
zugreifen und diese beibehalten können. Somit wird es Closures ermöglicht, Zustände
|
||||||
|
zwischen verschiedenen Aufrufen beizubehalten.
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
def createCounter() {
|
def createCounter() {
|
||||||
def count = 0
|
def count = 0 //lokale var
|
||||||
return { ->
|
return { ->
|
||||||
count += 1
|
count += 1
|
||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def counter = createCounter()
|
//Ergebnis bzw. closure wird counter zugewiesen
|
||||||
|
def counter = createCounter()
|
||||||
|
|
||||||
|
//counter hat zugriff auf count *innerhalb des Kontexts*
|
||||||
|
//in dem sie erstellt wurde
|
||||||
|
|
||||||
println(counter()) // Ausgabe: 1
|
println(counter()) // Ausgabe: 1
|
||||||
println(counter()) // Ausgabe: 2
|
println(counter()) // Ausgabe: 2
|
||||||
```
|
```
|
||||||
|
@ -256,7 +272,27 @@ def result = performOperation(5, closure)
|
||||||
println(result) // Ausgabe: 10
|
println(result) // Ausgabe: 10
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Wie ruft man eine Closure auf
|
||||||
|
|
||||||
|
Eine Closure kann sowohl als eine reguläre Methode als auch mit call aufrufen werden
|
||||||
|
|
||||||
|
```
|
||||||
|
// Closure-Definition
|
||||||
|
def greet = { name ->
|
||||||
|
return "Hello, ${name}!"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aufruf der Closure als reguläre Methode
|
||||||
|
println(greet("Alice")) // Ausgabe: Hello, Alice!
|
||||||
|
|
||||||
|
// Aufruf der Closure mit call
|
||||||
|
println(greet.call("Bob")) // Ausgabe: Hello, Bob!
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Methoden können auch auf Maps und Listen angewendet werden, besonders nützlich mit Closures.
|
Methoden können auch auf Maps und Listen angewendet werden, besonders nützlich mit Closures.
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
def myMap = [ 'subject': 'groovy', 'topic': 'closures']
|
def myMap = [ 'subject': 'groovy', 'topic': 'closures']
|
||||||
println myMap.each { it }
|
println myMap.each { it }
|
||||||
|
@ -269,7 +305,16 @@ println myList.every { item -> item > 3 } // false
|
||||||
println myList.collect { item -> item * 2 } // [2, 4, 6, 8, 10]
|
println myList.collect { item -> item * 2 } // [2, 4, 6, 8, 10]
|
||||||
```
|
```
|
||||||
|
|
||||||
- Methodenverkettung
|
Im Gegensatz zu einer regulären Groovy-Methode:
|
||||||
|
|
||||||
|
- Wir können eine Closure als Argument an eine Methode übergeben
|
||||||
|
- Wir können eine Closure einer Variablen zuweisen und später ausführen, entweder als Methode oder mit call.
|
||||||
|
- Groovy bestimmt den Rückgabewert der Closures zur Laufzeit.
|
||||||
|
- Wir können Closures innerhalb einer Closure deklarieren und aufrufen.
|
||||||
|
- Closures geben immer einen Wert zurück
|
||||||
|
|
||||||
|
|
||||||
|
### Methodenverkettung
|
||||||
|
|
||||||
Durch das Rückgeben von this kann man Methodenaufrufe verketten.
|
Durch das Rückgeben von this kann man Methodenaufrufe verketten.
|
||||||
|
|
||||||
|
@ -295,7 +340,8 @@ def person = new FluentPerson().setName("John").setAge(30)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
- Mixin(Misching)
|
|
||||||
|
### Mixin(Misching)
|
||||||
|
|
||||||
Man kann Funktionalität zu Klassen hinzufügen, ohne Vererbung zu verwenden, indem man
|
Man kann Funktionalität zu Klassen hinzufügen, ohne Vererbung zu verwenden, indem man
|
||||||
Mixins verwendet.
|
Mixins verwendet.
|
||||||
|
|
Loading…
Reference in New Issue