Java Refactoring und Quelltextaktionen
Visual Studio Code bietet zahlreiche Optionen, um Ihren Quelltext zu refaktorieren, sowie Quelltextaktionen zum Generieren von Code und Beheben von Fehlern während der Codierung. Um auf sie zuzugreifen, klicken Sie auf die Glühbirne 💡, wann immer Sie sie sehen. Oder klicken Sie mit der rechten Maustaste auf die Editoransicht und wählen Sie Quelltextaktion....
Liste unterstützter Quelltextaktionen
- Refactoring
- Variable zuweisen
- Anonyme zu verschachtelter Klasse konvertieren
- Zu anonyme Klassenerstellung konvertieren
- Zu erweiterte For-Schleife konvertieren
- Zu Lambda-Ausdruck konvertieren
- Zu statischem Import konvertieren
- Extraktions-Refactorings
- Inline-Refactorings
- Booleschen Wert invertieren
- Verschieben
- Umbenennen
- Typänderung
- Quelltextaktionen
- Andere unterstützte Quelltextaktionen
Refactoring
Das Ziel des Java-Programm-Refactorings ist es, systemweite Codeänderungen vorzunehmen, ohne das Verhalten des Programms zu beeinträchtigen. Die Java-Sprachunterstützung für VS Code bietet viele leicht zugängliche Refactoring-Optionen.
Refactoring aufrufen
Refactoring-Befehle sind über das Kontextmenü des Editors verfügbar. Wählen Sie das Element aus, das Sie refaktorieren möchten, klicken Sie mit der rechten Maustaste, um das Kontextmenü zu öffnen, und wählen Sie Refaktorieren....

Dann sehen Sie alle verfügbaren Refactoring-Optionen.
Variable zuweisen
Weist einen Ausdruck einer lokalen Variable oder einem Feld zu.
Beispiel
Vorher
Arrays.asList("apple", "lemon", "banana");
Nachher
List<String> fruits = Arrays.asList("apple", "lemon", "banana");
Es kann auch verwendet werden, um einen Parameter einem neuen Feld für ungenutzte Parameter in einem Konstruktor zuzuweisen.
Anonyme zu verschachtelter Klasse konvertieren
Konvertiert eine anonyme innere Klasse in eine Mitgliedsklasse.
Beispiel
Konvertieren wir die anonyme Klasse Interface(){...} in ein Mitglied der Klasse Clazz.
Vorher
public class Clazz {
public Interface method() {
final boolean isValid = true;
return new Interface() {
public boolean isValid() {
return isValid;
}
};
}
}
Nachher
public class Clazz {
private final class MyInterface extends Interface {
private final boolean isValid;
private MyInterface(boolean isValid) {
this.isValid = isValid;
}
public boolean isValid() {
return isValid;
}
}
public Interface method() {
final boolean isValid = true;
return new MyInterface(isValid);
}
}
Zu anonyme Klassenerstellung konvertieren
Konvertiert einen Lambda-Ausdruck in eine anonyme Klassenerstellung.
Beispiel
Die Variable runnable wird mit einem Lambda-Ausdruck zugewiesen. Konvertieren wir sie in eine anonyme Klassenerstellung.
Vorher
public void method() {
Runnable runnable = () -> {
// do something
};
}
Nachher
public void method() {
Runnable runnable = new Runnable() {
@Override
public void run() {
// do something
}
};
}
Siehe auch: Zu Lambda-Ausdruck konvertieren
Zu erweiterte For-Schleife konvertieren
Konvertiert die einfache for-Schleife in den for-each-Stil.
Beispiel
Vorher
public void order(String[] books) {
for (int i = 0; i < books.length; i++) {
// do something
}
}
Nachher
public void order(String[] books) {
for (String book : books) {
// do something
}
}
Zu Lambda-Ausdruck konvertieren
Konvertiert eine anonyme Klassenerstellung in den Lambda-Ausdruck.
Beispiel
Konvertieren wir die anonyme Klasse Runnable(){...} in einen Lambda-Ausdruck.
Vorher
public void method() {
Runnable runnable = new Runnable(){
@Override
public void run() {
// do something
}
};
}
Nachher
public void method() {
Runnable runnable = () -> {
// do something
};
}
Siehe auch: Zu anonyme Klassenerstellung konvertieren
Zu statischem Import konvertieren
Konvertiert das Feld oder die Methode in einen statischen Import.
Beispiel
Transformieren wir die Assert.assertEquals()-Aufrufe in einen statischen Import.
Vorher
import org.junit.Assert;
...
public void test() {
Assert.assertEquals(expected, actual);
}
Nachher
import static org.junit.Assert.assertEquals;
...
public void test() {
assertEquals(expected, actual);
}
Zu Konstante extrahieren
Erstellt ein statisches final-Feld aus dem ausgewählten Ausdruck, ersetzt den Ausdruck durch eine Feldreferenz und schreibt andere Stellen um, an denen derselbe Ausdruck vorkommt.
Beispiele
Extrahieren wir den Wert von π: 3.14 in eine Konstante.
Vorher
public double getArea(double r) {
return 3.14 * r * r;
}
Nachher
private static final double PI = 3.14;
public double getArea(double r) {
return PI * r * r;
}
Siehe auch: Konstante inline
Zu Feld extrahieren
Deklariert ein neues Feld, initialisiert es mit dem ausgewählten Ausdruck. Der ursprüngliche Ausdruck wird durch die Verwendung des Feldes ersetzt.
Beispiele
Extrahieren wir die Variable area in ein Feld der Klasse Square.
Vorher
class Square {
public void calculateArea() {
int height = 1;
int width = 2;
int area = height * width;
}
}
Nachher
class Square {
private int area;
public void calculateArea() {
int height = 1;
int width = 2;
area = height * width;
}
}
Beim Auswählen einer Variablendeklaration wird die Variable in ein Feld konvertiert.
Zu Methode extrahieren
Erstellt eine neue Methode, die die aktuell ausgewählten Anweisungen oder Ausdrücke enthält, und ersetzt die Auswahl durch eine Referenz auf die neue Methode. Diese Funktion ist nützlich, um lange, unübersichtliche oder zu komplexe Methoden zu bereinigen.
Beispiele
Extrahieren wir den Ausdruck height * width in eine neue Methode.
Vorher
public void method() {
int height = 1;
int width = 2;
int area = height * width;
}
Nachher
public void method() {
int height = 1;
int width = 2;
int area = getArea(height, width);
}
private int getArea(int height, int width) {
return height * width;
}
Siehe auch: Methode inline
Zu lokale Variable extrahieren
Erstellt eine neue Variable, der der aktuell ausgewählte Ausdruck zugewiesen wird, und ersetzt die Auswahl durch eine Referenz auf die neue Variable.
Beispiele
Extrahieren wir den Ausdruck platform.equalsIgnoreCase("MAC") in eine neue Variable.
Vorher
public void method() {
if (platform.equalsIgnoreCase("MAC")) {
// do something
}
}
Nachher
public void method() {
boolean isMac = platform.equalsIgnoreCase("MAC");
if (isMac) {
// do something
}
}
Nach der Extraktion können Sie auch eine Umbenennung in derselben Transaktion durchführen.
Siehe auch: Lokale Variable inline
Konstante inline
Ersetzt eine konstante Referenz durch ihren definierten Wert.
Beispiele
Ersetzen wir die Konstante PI durch ihren definierten Wert: 3.14.
Vorher
private static final double PI = 3.14;
public double getArea(double r) {
return PI * r * r;
}
Nachher
private static final double PI = 3.14;
public double getArea(double r) {
return 3.14 * r * r;
}
Siehe auch: Zu Konstante extrahieren
Lokale Variable inline
Ersetzt redundante Variablennutzung durch ihren Initialisierer.
Beispiele
Ersetzen wir die Variable isMac direkt durch den Booleschen Ausdruck.
Vorher
public void method() {
boolean isMac = platform.equalsIgnoreCase("MAC");
if (isMac) {
// do something
}
}
Nachher
public void method() {
if (platform.equalsIgnoreCase("MAC")) {
// do something
}
}
Siehe auch: Zu lokale Variable extrahieren
Methode inline
Ersetzt Aufrufe der Methode durch den Körper der Methode.
Beispiel
Ersetzen wir die Methode getArea(int height, int width) direkt durch den Ausdruck height * width.
Vorher
public void method() {
int height = 1;
int width = 2;
int area = getArea(height, width);
}
private int getArea(int height, int width) {
return height * width;
}
Nachher
public void method() {
int height = 1;
int width = 2;
int area = height * width;
}
Siehe auch: Zu Methode extrahieren
Bedingungen invertieren
Invertiert den Booleschen Ausdruck in den Bedingungen.
Beispiel
Invertieren wir den Booleschen Ausdruck in der if-Anweisung.
Vorher
public void method(int value) {
if (value > 5 && value < 15) {
// do something
}
}
Nachher
public void method(int value) {
if (value <= 5 || value >= 15) {
// do something
}
}
Lokale Variable invertieren
Invertiert die lokale Boolesche Variable.
Beispiel
Invertieren wir die Variable valid.
Vorher
public void method(int value) {
boolean valid = value > 5 && value < 15;
}
Nachher
public void method(int value) {
boolean notValid = value <= 5 || value >= 15;
}
Verschieben
Verschiebt die ausgewählten Elemente und korrigiert alle Referenzen auf die Elemente (auch in anderen Dateien). Verfügbare Aktionen sind:
- Klasse in anderes Paket verschieben
- Statische oder Instanzmethode in andere Klasse verschieben
- Innere Klasse in neue Datei verschieben
Beispiel
Verschieben wir die statische Methode print() von der Klasse Office in die Klasse Printer.
Vorher
public class Office {
public static void main(String[] args) {
print();
}
public static void print() {
System.out.println("This is printer");
}
static class Printer { }
}
Nachher
public class Office {
public static void main(String[] args) {
Printer.print();
}
static class Printer {
public static void print() {
System.out.println("This is printer");
}
}
}
Refactoring verschieben einer statischen Methode, wenn sie in einer anderen Klasse häufiger verwendet wird als in ihrer eigenen Klasse.
Eine Klasse in ein anderes Paket verschieben. Derzeit wird das Verschieben von Refactoring nicht aus dem Explorer unterstützt.
Eine innere Klasse in eine neue Datei verschieben.
Umbenennen
Standard-Tastenkombination: F2
Benennt das ausgewählte Element um und korrigiert alle Referenzen auf die Elemente (auch in anderen Dateien).
Beispiel
Benennen wir die Klasse Foo in Bar um.
Vorher
public class Foo {
// ...
}
public void myMethod() {
Foo myClass = new Foo();
}
Nachher
public class Bar {
// ...
}
public void myMethod() {
Bar myClass = new Bar();
}
Die Tastenkombination zum Aufrufen des Rename-Refactorings ist F2. Wenn Sie die Tastenkombination für einen Bezeichner im Editor aufrufen, wird im Editor selbst ein kleines Feld angezeigt, in dem Sie den Namen des Bezeichners ändern können. Wenn Sie Enter drücken, werden auch alle Referenzen auf diesen Bezeichner geändert.
Rename-Refactoring wird auch aus dem Explorer für Ordner und Dateien unterstützt. Nach der Anforderung der Änderung wird eine Vorschau der betroffenen Dateien angezeigt, und Sie können entscheiden, wie diese Änderungen angewendet werden sollen.

Auf var-Typen aufgelösten Typ ändern
Verwendet var zur Deklaration lokaler Variablen.
Beispiel
Vorher
String s = "";
Nachher
var s = "";
Siehe auch: Var-Typ auf aufgelösten Typ ändern
Var-Typ auf aufgelösten Typ ändern
Verwendet den aufgelösten Typ zur Deklaration lokaler Variablen.
Beispiel
Vorher
var s = "";
Nachher
String s = "";
Siehe auch: Auf var-Typen aufgelösten Typ ändern
Quelltextaktionen
Quelltextaktionen können verwendet werden, um gängige Code-Strukturen und wiederkehrende Elemente zu generieren. Einige davon sind Quick Fixes, die Ihnen helfen, Code-Probleme im laufenden Betrieb zu beheben.
Konstruktoren generieren
Konstruktor für die Klasse hinzufügen.
Delegate-Methoden generieren
Delegate-Methoden generieren
Methoden überschreiben/implementieren
Mit dieser Quelltextaktion werden Ihnen alle Kandidaten mit einer Checkliste präsentiert. Sie können dann entscheiden, was überschrieben oder implementiert werden soll.
Imports organisieren
Sie können diese Quelltextaktion verwenden, um Ihre Importe zu bereinigen. Sie kann auch mit mehrdeutigen Imports umgehen, in diesem Fall wird Ihnen eine Dropdown-Liste präsentiert, aus der Sie die richtige auswählen können. Die Codezeile mit dem nicht aufgelösten Typ wird Ihnen ebenfalls angezeigt, um Ihnen bei der Entscheidung zu helfen.
Getter und Setter generieren
Sie können Getter und Setter für alle neuen Mitgliedsvariablen in Stapelverarbeitung generieren. Wenn die Klasse mehr als ein Feld hat, fordert die Quelltextaktion eine schnelle Auswahl auf, damit Sie die Zielfelder auswählen können, die zur Generierung der Zugriffsermittlungsmethoden verwendet werden sollen.
hashCode() und equals() generieren
hashCode() und equals() können mit Standardimplementierungen generiert werden. Alle nicht-statischen Mitgliedsvariablen werden aufgelistet, und Sie können den generierten Code mit der Checkliste anpassen.
Es gibt zwei Optionen, um den generierten Code anzupassen:
- Wenn Sie Java 7 oder höher verwenden, können Sie
java.codeGeneration.hashCodeEquals.useJava7Objectsauftruesetzen, um kürzeren Code zu generieren, derObjects.hashundObjects.equalsaufruft. - Sie können auch
java.codeGeneration.hashCodeEquals.useInstanceofauftruesetzen, um deninstanceOf-Operator zu verwenden, um die Objekttypen zu überprüfen, anstattObject.getClass()aufzurufen.
toString() generieren
Es gibt eine neue Quelltextaktion, um die Methode toString() zu generieren. Anpassungen sind mit einer Checkliste aller Mitgliedsvariablen möglich.
Modifikatoren nach Möglichkeit auf final ändern
Fügt den Modifikator final zu allen Variablen und Parametern in der aktuellen Quelldatei hinzu.
Beispiel
Vorher
public class Clazz {
public void method(int value) {
boolean notValid = value > 5;
if (notValid) {
// do something
}
}
}
Nachher
public class Clazz {
public void method(final int value) {
final boolean notValid = value > 5;
if (notValid) {
// do something
}
}
}
Nicht zugängliche Referenz beheben
Dieser Quick Fix hilft Ihnen, nicht zugängliche Referenzen zu beheben.
Nicht vorhandenes Paket erstellen
Wenn Ihr Paketname nicht mit dem Ordnernamen übereinstimmt, haben Sie die Möglichkeit, entweder den Paketnamen in Ihrem Quelltext zu ändern oder den Ordner im Dateisystem zu verschieben (auch wenn der Zielordner noch nicht existiert).
Andere unterstützte Quelltextaktionen
Die Liste der von VS Code unterstützten Quelltextaktionen wächst ständig und listet nur die beliebtesten auf. Weitere nennenswerte unterstützte Aktionen sind (aber nicht beschränkt auf):
- Nicht aufgelöste Typen erstellen
final-Modifikator entfernen- Unnötige Casts entfernen
- Redundante Schnittstellen entfernen
- Fehlende case-Labels in switch-Anweisungen hinzufügen
- Zu Definition springen bei break/continue
- Zugriff auf statische Elemente korrigieren