Der Refaktor „Elimination einer final-Variablen“ in Java
Das folgende Programm enthält eine lokale final-Variablen »k«.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int k = 22; java.lang.System.out.println( k ); }}java.lang.System.out
22
Das folgende gleichwertige Programm enthält keine lokale final-Variable mehr.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 22 ); }}java.lang.System.out
22
Bei der Elimination einer lokalen final-Variablen wird der Namen einer final-Variablen an allen Stellen seiner Verwendung innerhalb des Gültigkeitsbereichs seiner Deklaration durch den eingeklammerten Initialisierungsausdruck aus der Deklaration dieses final-Variablennamens ersetzt. Danach wird die Deklarationsanweisung mit der Deklaration dieser lokalen final-Variablen entfernt. Die Klammern des eingeklammerten Ausdrucks können schließlich entfernt werden, falls dies die Bedeutung (=das Verhalten) des Ausdrucks nicht ändert. (Dies kann bei jeder Stelle anders sein.)
Zulässigkeit Dies ist aber unter Umständen nur dann zulässig, wenn die vorkommenden Auswertungen keine Wirkungen (sondern nur Werte) haben, da die Wirkungen sonst möglicherweise an anderer Stelle auftreten würden.
Indikation Dieser Refaktor wird verwendet, wenn die Verwendung einer final-Variablen keinen Vorteil hat, und die final-Variable daher aus dem Programm entfernt werden soll.
Namen “Inline Temporary Variable ” (Visual Studio 2016), “Inline …” (Netbeans 2018).
Beispiel
Das folgende Beispiel einer Bearbeitung zeigt die Vorgehensweise bei der Umsetzung dieses Refaktors.
Wir gehen von dem folgenden Programm aus.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int k = 22; java.lang.System.out.println( k ); }}java.lang.System.out
22
Der Initialisierungsausdruck der final-Variablen in ihrer Deklaration »k« lautet »22«. Wir ersetzen nun alle Verwendungen der final-Variablen »k« im Gültigkeitsbereich ihrer Deklaration durch den eingeklammerten Initialisierungsausdruck.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int k = 22; java.lang.System.out.println( ( 22 )); }}java.lang.System.out
22
Nun können wir die Deklarationsanweisung der final-Variablen entfernen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( ( 22 )); }}java.lang.System.out
22
Da die Klammern um den Initialisierungsausdruck in dem obigen Programm nicht nötig sind, können wir auch sie entfernen und gelangen so zu dem folgenden Ergebnis des Refaktors.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 22 ); }}java.lang.System.out
22
Übungsaufgaben
/ Elimination einer lokalen final-Variablen
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double x = 2.3;
java.lang.System.out.println( x ); }}transcript
2.3
Ersetzen Sie in dem voranstehenden Programm alle Verwendungen der final-Variablen »x« durch den Initialisierungsausdruck jener final-Variablen und entfernen Sie alsdann die Deklarationsanweisung jener final-Variablen. Es soll sich um einen Refaktor handeln; daraus folgt, daß die Ausgabe des Programms sich nicht verändern sollte.
/ Elimination einer lokalen final-Variablen (1)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.String s = "abc";
java.lang.System.out.println( s ); }}transcript
abc
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Ersetzen Sie in dem voranstehenden Programm alle Verwendungen der final-Variablen »x« durch den Initialisierungsausdruck jener final-Variablen und entfernen Sie alsdann die Deklarationsanweisung jener final-Variablen. Es soll sich um einen Refaktor handeln; daraus folgt, daß die Ausgabe des Programms sich nicht verändern sollte.
/ Elimination einer lokalen final-Variablen (2)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double x = 1.7;
java.lang.System.out.println( x ); }}transcript
1.7
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Ersetzen Sie in dem voranstehenden Programm alle Verwendungen der final-Variablen »x« durch den Initialisierungsausdruck jener final-Variablen und entfernen Sie alsdann die Deklarationsanweisung jener final-Variablen. Es soll sich um einen Refaktor handeln; daraus folgt, daß die Ausgabe des Programms sich nicht verändern sollte.
/ Elimination aller lokalen final-Variablen (3)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double x = 2.;
final double y = x;
java.lang.System.out.println( y ); }}transcript
2.0
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Wenden Sie den Refaktor Elimination einer lokalen final-Variablen auf das voranstehende Programm an, um alle beiden lokalen final-Variablen zu eliminieren! Das Programm darf hinterher keine lokalen final-Variablendeklarationen mehr enthalten und muß weiterhin dasselbe Verhalten (dieselbe Ausgabe) zeigen.
/ Elimination aller lokalen final-Variablen (4)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.String v = "abc";
final java.lang.String w = v;
java.lang.System.out.println( w ); }}transcript
abc
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Wenden Sie den Refaktor Elimination einer lokalen final-Variablen auf das voranstehende Programm an, um alle beiden lokalen final-Variablen zu eliminieren! Das Programm darf hinterher keine lokalen final-Variablendeklarationen mehr enthalten und muß weiterhin dasselbe Verhalten (dieselbe Ausgabe) zeigen.
/ Elimination aller lokalen final-Variablen (5)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int a = 4;
final int b = a;
java.lang.System.out.println( a ); }}transcript
4
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Wenden Sie den Refaktor Elimination einer lokalen final-Variablen auf das voranstehende Programm an, um alle beiden lokalen Konstanten zu eliminieren! Das Programm darf hinterher keine lokalen Konstantendeklarationen mehr enthalten und muß weiterhin dasselbe Verhalten (dieselbe Ausgabe) zeigen.
/ Elimination aller lokalen final-Variablen (6)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int i = 2;
final int j = 8 * i;
java.lang.System.out.println( j ); }}transcript
16
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Wenden Sie den Refaktor Elimination einer lokalen final-Variablen auf das voranstehende Programm an, um alle beiden lokalen Konstanten zu eliminieren! Das Programm darf hinterher keine lokalen Konstantendeklarationen mehr enthalten und muß weiterhin dasselbe Verhalten (dieselbe Ausgabe) zeigen.
/ Elimination aller lokalen final-Variablen (7)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double x = 2.;
final double y = java.lang.Math.floor( x );
java.lang.System.out.println( 2 * y );
java.lang.System.out.println( x ); }}transcript
4.0
2.0
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Wenden Sie den Refaktor Elimination einer lokalen final-Variablen auf das voranstehende Programm an, um alle beiden lokalen final-Variablen zu eliminieren! Das Programm darf hinterher keine lokalen final-Variablendeklarationen mehr enthalten und muß weiterhin dasselbe Verhalten (dieselbe Ausgabe) zeigen.
/ Elimination aller lokalen final-Variablen (8)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double x = 1.;
final double y = java.lang.Math.sin( x );
final double z = java.lang.Math.sqrt( y );
final double u = java.lang.Math.pow( y, 0.51 );
java.lang.System.out.println( z );
java.lang.System.out.println( u ); }}java.lang.System.out
0.9173172759781081
0.9157353176470164
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Wenden Sie den Refaktor Elimination einer lokalen final-Variablen auf das voranstehende Programm an, um alle vier lokalen final-Variablen zu eliminieren!
/ Elimination aller lokalen final-Variablen (9)
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final double x = 1.;
final double t = java.lang.Math.sin( x )+java.lang.Math.cos( x );
final double q = java.lang.Math.sqrt( t )+ t;
final double r = java.lang.Math.pow( t*q, 2 );
java.lang.System.out.println( r ); }}java.lang.System.out
12.486018605166068
Die Bearbeitung dieser Aufgabe hier sollte nicht vor der Nachbesprechung der vorherigen Übungsaufgabe in Angriff genommen werden!
Wenden Sie den Refaktor Elimination einer lokalen final-Variablen auf das voranstehende Programm an, um alle vier lokale Konstanten zu eliminieren.