Methodenreferenzen in Java
Methodenausdrücke
Wir setzen die bereits früher schon behandelten Methodenliterale hier als bekannt voraus.
Das folgende Programm zeigt zunächst einen Methodenausdruck, der mit einem Methodenliteral geschrieben ist.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.Runnable runnable = () -> java.lang.System.out.println( "run" );
runnable.run(); }}transcript
run
Referenzen zu statischen Methoden
Das folgende Programm zeigt eine statische Methodenreferenz.
Main.java
public final class Main
{ public static void block(){ java.lang.System.out.println( "run" ); }public static void main( final java.lang.String[] args )
{ final java.lang.Runnable runnable = Main::block;
runnable.run(); }}transcript
run
Ein weiteres Beispiel:
Main.java
public final class Main
{
public static void print( final java.lang.String text )
{ java.lang.System.out.printf
( "%-10s %s%n", text,
javax.lang.model.SourceVersion.isName( text )); }
public static void main( final java.lang.String[] args )
{ java.util.Arrays.asList
( "=", "0", "3d", "int", "true", "x", "alpha", "alpha3", "alpha.beta" ).
forEach( Main::print ); }}transcript
= false
0 false
3d false
int false
true false
x true
alpha true
alpha3 true
alpha.beta true- 〈Methodenreferenz 〉 ::=
- 〈Klasse 〉 "::" 〈Methodenbezeichner 〉.
Referenzen zu Exemplarmethoden
Das folgende Programm zeigt eine Exemplarmethodenreferenz.
Main.java
public final class Main
{ public void block(){ java.lang.System.out.println( "run" ); }public static void main( final java.lang.String[] args )
{ final java.lang.Runnable runnable = new Main()::block;
runnable.run(); }}transcript
run
- 〈Methodenreferenz 〉 ::=
- 〈Objekt 〉 "::" 〈Methodenbezeichner 〉.
Eine Methodenreferenz ist eine Ausdruck für eine Methode.
Methodenausdruck = Oberbegriff für Methodenliteral und Methodenreferenz
Beispiel mit JavaFX
Das folgende Programm zeigt die Verwendung von Methodenreferenzen in Zusammenhang mit JavaFX.
Main.java
public final class Main extends javafx.application.Application
{javafx.scene.control.TextField text = new javafx.scene.control.TextField( "text" );
javafx.scene.control.TextField text1 = new javafx.scene.control.TextField( "text1" );
static javafx.scene.control.TextField text2 = new javafx.scene.control.TextField( "text2" );public void example( final javafx.event.ActionEvent event )
{ text1.setText( "alpha1" ); }public static void staticExample( final javafx.event.ActionEvent event )
{ text2.setText( "alpha2" ); }
@java.lang.Override
public void start( final javafx.stage.Stage primaryStage )
{ text = new javafx.scene.control.TextField( "text" );
text1 = new javafx.scene.control.TextField( "text1" );
text2 = new javafx.scene.control.TextField( "text2" );
text.setOnAction( e -> { text.setText( "alpha" ); } );
text1.setOnAction( this::example );
text2.setOnAction( Main::staticExample );
final javafx.scene.layout.VBox vbox = new javafx.scene.layout.VBox();
vbox.getChildren().add( text );
vbox.getChildren().add( text1 );
vbox.getChildren().add( text2 );
final javafx.scene.Scene scene = new javafx.scene.Scene( vbox );
primaryStage.setTitle( "Main" );
primaryStage.setScene( scene );
primaryStage.show(); }}