Java-Refactoring und Quellcode-Aktionen
Visual Studio Code bietet viele Optionen zum Refactoring Ihres Quellcodes sowie Quellcode-Aktionen (Source Actions), um während der Programmierung Code zu generieren und Probleme zu beheben. Um darauf zuzugreifen, klicken Sie auf die Glühbirne 💡, wann immer Sie sie sehen. Alternativ können Sie mit der rechten Maustaste in die Editoransicht klicken und Source Action... (Quellcode-Aktion...) auswählen.
Liste der unterstützten Code-Aktionen
- Refactoring
- Variable zuweisen
- Anonyme Klasse in geschachtelte Klasse umwandeln
- In anonyme Klassenerstellung umwandeln
- In erweiterte for-Schleife umwandeln
- In Lambda-Ausdruck umwandeln
- In statischen Import umwandeln
- Extrahierungs-Refactorings
- Inline-Refactorings
- Booleschen Wert invertieren
- Verschieben (Move)
- Umbenennen
- Typänderung
- Quellcode-Aktionen
- Weitere unterstützte Code-Aktionen
Refactoring
Das Ziel des Java-Programm-Refactorings ist es, systemweite Codeänderungen vorzunehmen, ohne das Verhalten des Programms zu beeinträchtigen. Die Java Language Support-Erweiterung 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 refactoren möchten, klicken Sie mit der rechten Maustaste, um das Kontextmenü zu öffnen, und wählen Sie Refactor... aus.

Anschließend 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 Klasse in geschachtelte Klasse umwandeln
Wandelt eine anonyme innere Klasse in eine Member-Klasse um.
Beispiel
Lassen Sie uns die anonyme Klasse Interface(){...} in ein Mitglied der Klasse Clazz umwandeln.
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);
}
}
In anonyme Klassenerstellung umwandeln
Wandelt einen Lambda-Ausdruck in eine anonyme Klassenerstellung um.
Beispiel
Der Variable runnable ist ein Lambda-Ausdruck zugewiesen. Lassen Sie uns diesen in eine anonyme Klassenerstellung umwandeln.
Vorher
public void method() {
Runnable runnable = () -> {
// do something
};
}
Nachher
public void method() {
Runnable runnable = new Runnable() {
@Override
public void run() {
// do something
}
};
}
Siehe auch: In Lambda-Ausdruck umwandeln
In erweiterte for-Schleife umwandeln
Wandelt die einfache for-Schleife in den for-each-Stil um.
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
}
}
In Lambda-Ausdruck umwandeln
Wandelt eine anonyme Klassenerstellung in einen Lambda-Ausdruck um.
Beispiel
Lassen Sie uns die anonyme Klasse Runnable(){...} in einen Lambda-Ausdruck umwandeln.
Vorher
public void method() {
Runnable runnable = new Runnable(){
@Override
public void run() {
// do something
}
};
}
Nachher
public void method() {
Runnable runnable = () -> {
// do something
};
}
Siehe auch: In anonyme Klassenerstellung umwandeln
In statischen Import umwandeln
Wandelt das Feld oder die Methode in einen statischen Import um.
Beispiel
Lassen Sie uns den Aufruf Assert.assertEquals() in einen statischen Import umwandeln.
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);
}
Als Konstante extrahieren
Erstellt ein statisches final Feld aus dem ausgewählten Ausdruck, ersetzt die Feldreferenz und aktualisiert andere Stellen, an denen derselbe Ausdruck vorkommt.
Beispiele
Lassen Sie uns den Wert von π: 3.14 als Konstante extrahieren.
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 inlinen
Als Feld extrahieren
Deklariert ein neues Feld und initialisiert es mit dem ausgewählten Ausdruck. Der ursprüngliche Ausdruck wird durch die Verwendung des Feldes ersetzt.
Beispiele
Lassen Sie uns die Variable area als Feld der Klasse Square extrahieren.
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 umgewandelt.
Als Methode extrahieren
Erstellt eine neue Methode mit den aktuell ausgewählten Anweisungen oder Ausdrücken und ersetzt die Auswahl durch einen Verweis auf die neue Methode. Diese Funktion ist nützlich, um lange, unübersichtliche oder zu komplexe Methoden aufzuräumen.
Beispiele
Lassen Sie uns den Ausdruck height * width in eine neue Methode extrahieren.
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 inlinen
Als lokale Variable extrahieren
Erstellt eine neue Variable, der der aktuell ausgewählte Ausdruck zugewiesen ist, und ersetzt die Auswahl durch einen Verweis auf die neue Variable.
Beispiele
Lassen Sie uns den Ausdruck platform.equalsIgnoreCase("MAC") als neue Variable extrahieren.
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 Extrahierung können Sie in derselben Transaktion auch eine Umbenennung durchführen.
Siehe auch: Lokale Variable inlinen
Konstante inlinen
Ersetzt eine Konstantenreferenz durch ihren definierten Wert.
Beispiele
Lassen Sie uns die Konstante PI durch ihren definierten Wert 3.14 ersetzen.
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: Als Konstante extrahieren
Lokale Variable inlinen
Ersetzt die redundante Verwendung einer Variablen durch ihren Initialisierer.
Beispiele
Lassen Sie uns die Variable isMac direkt durch den booleschen Ausdruck ersetzen.
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: Als lokale Variable extrahieren
Methode inlinen
Ersetzt Aufrufe der Methode durch den Methodenrumpf.
Beispiel
Lassen Sie uns die Methode getArea(int height, int width) direkt durch den Ausdruck height * width ersetzen.
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: Als Methode extrahieren
Bedingungen invertieren
Invertiert den booleschen Ausdruck in den Bedingungen.
Beispiel
Lassen Sie uns den booleschen Ausdruck in der if-Anweisung invertieren.
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
Lassen Sie uns die Variable valid invertieren.
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 (Move)
Verschiebt die ausgewählten Elemente und korrigiert alle Referenzen auf diese Elemente (auch in anderen Dateien). Verfügbare Aktionen sind:
- Klasse in ein anderes Paket verschieben
- Statische oder Instanzmethode in eine andere Klasse verschieben
- Innere Klasse in eine neue Datei verschieben
Beispiel
Lassen Sie uns die statische Methode print() von der Klasse Office in die Klasse Printer verschieben.
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");
}
}
}
Verschiebe-Refactoring bei einer statischen Methode, wenn diese in einer anderen Klasse häufiger verwendet wird als in ihrer eigenen.
Verschieben einer Klasse in ein anderes Paket. Derzeit wird das Verschiebe-Refactoring vom Datei-Explorer aus nicht unterstützt.
Verschieben einer inneren Klasse in eine neue Datei.
Umbenennen
Standard-Tastenkombination: F2
Benennt das ausgewählte Element um und korrigiert alle Referenzen auf diese Elemente (auch in anderen Dateien).
Beispiel
Lassen Sie uns die Klasse Foo in Bar umbenennen.
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 Umbenennungs-Refactorings ist F2. Wenn Sie die Tastenkombination auf einem Bezeichner im Editor aufrufen, wird ein kleines Feld innerhalb des Editors angezeigt, in dem Sie den Namen ändern können. Wenn Sie Enter drücken, werden auch alle Referenzen auf diesen Bezeichner geändert.
Das Umbenennungs-Refactoring wird auch im Datei-Explorer für Ordner und Dateien unterstützt. Nach dem Anfordern der Änderung wird eine Vorschau der betroffenen Dateien bereitgestellt, und Sie können entscheiden, wie diese Änderungen angewendet werden sollen.

Aufgelösten Typ in var-Typ ändern
Verwendet var zur Deklaration lokaler Variablen.
Beispiel
Vorher
String s = "";
Nachher
var s = "";
Siehe auch: var-Typ in aufgelösten Typ ändern
var-Typ in aufgelösten Typ ändern
Verwendet den aufgelösten Typ zur Deklaration lokaler Variablen.
Beispiel
Vorher
var s = "";
Nachher
String s = "";
Siehe auch: Aufgelösten Typ in var-Typ ändern
Quellcode-Aktionen
Quellcode-Aktionen können verwendet werden, um allgemeine Codestrukturen und wiederkehrende Elemente zu generieren. Einige davon sind Quick Fixes, die Ihnen helfen, Codeprobleme sofort zu beheben.
Konstruktoren generieren
Einen Konstruktor für die Klasse hinzufügen.
Delegat-Methoden generieren
Delegat-Methoden generieren
Methoden überschreiben/implementieren
Mit dieser Quellcode-Aktion werden Ihnen alle Kandidaten mit einer Checkliste präsentiert. Sie können dann entscheiden, was überschrieben oder implementiert werden soll.
Importe organisieren
Sie können diese Quellcode-Aktion verwenden, um Ihre Importe aufzuräumen. Sie kann auch mit mehrdeutigen Importen umgehen; in diesem Fall wird eine Dropdown-Liste angezeigt, aus der Sie den richtigen auswählen können. Die Codezeile mit dem nicht aufgelösten Typ wird ebenfalls angezeigt, um Ihnen bei der Entscheidung zu helfen.
Getter und Setter generieren
Sie können Getter und Setter für alle neuen Member-Variablen in einem Rutsch generieren. Wenn die Klasse mehr als ein Feld hat, fordert Sie die Quellcode-Aktion über eine Schnellauswahl (Quick Pick) auf, die Zielfelder für die Accessor-Methoden auszuwählen.
hashCode() und equals() generieren
hashCode() und equals() können mit Standardimplementierungen generiert werden. Alle nicht-statischen Member-Variablen werden aufgelistet, und Sie können den generierten Code mithilfe der Checkliste anpassen.
Es gibt zwei Optionen zur Anpassung des generierten Codes:
- Wenn Sie Java 7+ 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 anstelle vonObject.getClass()zur Typüberprüfung zu verwenden.
toString() generieren
Es gibt eine neue Quellcode-Aktion zum Generieren der toString()-Methode. Eine Anpassung ist über eine Checkliste aller Member-Variablen möglich.
Modifikatoren wenn möglich auf final setzen
Fügt den final-Modifikator 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 zugreifbare Referenz korrigieren
Dieser Quick Fix hilft Ihnen, nicht zugreifbare Referenzen zu beheben.
Nicht existierendes Paket erstellen
Wenn Ihr Paketname nicht mit dem Ordnernamen übereinstimmt, haben Sie die Möglichkeit, entweder den Paketnamen in Ihrem Quellcode zu ändern oder den Ordner im Dateisystem zu verschieben (selbst wenn der Zielordner noch nicht existiert).
Weitere unterstützte Code-Aktionen
Die Liste der von VS Code unterstützten Code-Aktionen wächst ständig; oben sind nur die beliebtesten aufgeführt. Weitere erwähnenswerte unterstützte Aktionen sind (unter anderem):
- Nicht aufgelöste Typen erstellen
- Den
final-Modifikator entfernen - Unnötige Typumwandlung (Cast) entfernen
- Redundante Interfaces entfernen
- Fehlende case-Labels in switch-Anweisungen hinzufügen
- Springe zur Definition bei break/continue
- Zugriff auf statische Elemente korrigieren