groovy-lecture/klassen&methoden.md

6.0 KiB

Klassen

  • Definition einer Klasse Klassen in Groovy werden ähnlich wie in Java definiert, jedoch mit einigen syntaktischen Erleichterungen

Beispiel

class Person {
  String name
  int age
}
  • Eigenschaften Eigenschaften können direkt als Felder definiert werden. Groovy generiert automatisch Getter- und Setter-Methoden (wie in Ruby)

Beispiel

Person person = new Person()
person.name = "John"
person.age = 30
person.age = 30
println person.name
//John

Getter und Setter können aber auch manuell überschrieben werden

Beispiel

class Fruits {
private String fruitName
private String fruitColor
      
def setFruitName(String name) {
  fruitName = name
  }
  
def getFruitName() {
  return "The fruitname is $fruitName"
   }
   
def setFruitColor(String color) {
    fruitColor = color
    }
       
def getFruitColor(){
    return "The color is $fruitColor"
   }
   
static void(args) {
   //Instanz erstellen
   Fruits apple = new Fruits()
   apple.setFruitName("apple")
   apple.setFruitColor("red")
}
}

-Konstruktoren Groovy fügt automatisch einen Standardkonstruktor hinzu. Man kann auch benutzerdefinierte Konstruktoren definieren.

class Person {
String name
int age

Person(String name, int age) {
    this.name = name
    this.age = age
  }
}

-Standardkonstruktor mit Map Groovy bietet eine spezielle Initialisierungsform mit einer Map an

Person person = new Person(name: 'John', age: 30)

Methoden

  • Definition einer Methode Methoden werden ähnlich wie in Java definiert, können aber optional einen Rückgabetyp haben
  class Calculator {
    int add(int a, int b) {
        return a + b
    }
}

In Groovy können Methoden direkt ohne Klasse und main-Methode definiert und aufgerufen werden.

Beispiel 1

def printHello() {
println "Hello..."
}

printHello()

def sum(int a, int b) {
println "Sum is "+(a+b)
}

sum(5,2)
//Hello...
// 7
  • Instanzmethoden Methoden können Instanzmethoden sein und auf Instanzvariablen zugreifen.
class Method {

 static void main(args) {
  Method myFunc = new Method()
  myFunc.myMethod()
}

def myMethod() {
  println("I am inside my method")
}
}
  • Statische Methoden
class MathUtils {
    // Definition einer statischen Methode
    static int add(int a, int b) {
        return a + b
    }
    
    static void main(String[] args) {
        // Aufruf der statischen Methode ohne Instanz der Klasse
        int result = MathUtils.add(5, 10)
        println("Sum is $result")  // Ausgabe: Sum is 15
    }
}
  • Dynamische Methoden Groovy erlaubt es, Methoden zur Laufzeit hinzuzufügen. In diesem Beispiel wird die Methode sayHello zur Klasse DynamicExample hinzugefügt, nachdem die Klasse bereits definiert wurde

Beispiel

class DynamicExample {}

// Hinzufügen einer Methode zur Laufzeit
DynamicExample.metaClass.sayHello = { -> println "Hello, World!" }

def example = new DynamicExample()
example.sayHello()
  • 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

Beispiel

// Erstellen eines Expando-Objekts
def expando = new Expando()

// Hinzufügen einer Eigenschaft 'name' und Zuweisung des Wertes "Groovy"
expando.name = "Groovy"

// Hinzufügen einer Methode 'sayHello', die eine Nachricht ausgibt, die die Eigenschaft 'name' verwendet
expando.sayHello = { -> println "Hello from $name" }

// Aufrufen der Methode 'sayHello', was die Nachricht "Hello from Groovy" ausgibt
expando.sayHello()  // Ausgabe: Hello from Groovy
  • Default-Parameterwerte Methodenparameter können Standdardwerte haben(wie in Ruby)

Beispiel 1

class Greeter {
    void greet(String name = "World") {
        println "Hello, $name!"
    }
}

Ruft man die Methode ohne Parameter auf, werden die Default-Paramter eingesetzt Beispiel 2

def sum(int a=10, int b=3) {
  println "Sum is "+(a+b)
}

sum()
  • Closures 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 existierten.
  1. Parameter
def greet = { String name -> println "Hello, $name!" }
greet.call("John")
  1. Referenzierung von Variablen und Rückgabewerte
def createCounter() {
  def count = 0
  return { ->
      count += 1
      return count
  }
}

def counter = createCounter()
println(counter())  // Ausgabe: 1
println(counter())  // Ausgabe: 2
  1. Übergabe als Parameter
def performOperation(int x, Closure operation) {
  return operation(x)
}

def closure = { y -> y * 2 }
def result = performOperation(5, closure)
println(result)  // Ausgabe: 10

Methoden können auch auf Maps und Listen angewendet werden, besonders nützlich mit Closures.

def myMap = [ 'subject': 'groovy', 'topic': 'closures']
println myMap.each { it }

def myList = [1, 2, 3, 4, 5]
println myList.find { item -> item == 3 }  // 3
println myList.findAll { item -> item > 3 }  // [4, 5]
println myList.any { item -> item > 5 }  // false
println myList.every { item -> item > 3 }  // false
println myList.collect { item -> item * 2 }  // [2, 4, 6, 8, 10]
  • Methodenverkettung Durch das Rückgeben von this kann man Methodenaufrufe verketten.

Beispiel

class FluentPerson {
  String name
  int age
  
  FluentPerson setName(String name) {
      this.name = name
      return this
  }
  
  FluentPerson setAge(int age) {
      this.age = age
      return this
  }
}

def person = new FluentPerson().setName("John").setAge(30)
  • Mixin(Misching) Man kann Funktionalität zu Klassen hinzufügen, ohne Vererbung zu verwenden, indem man Mixins verwendet.

Beispiel

class ExtraMethods {
  String shout(String str) {
      return str.toUpperCase()
  }
}

@Mixin(ExtraMethods)
class MyClass {}

def myObject = new MyClass()
println myObject.shout("hello")