Entdecken Sie agentenbasierte Entwicklung –

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

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.

Invoke Refactoring

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.

Rename from Explorer

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.useJava7Objects auf true setzen, um kürzeren Code zu generieren, der Objects.hash und Objects.equals aufruft.
  • Sie können auch java.codeGeneration.hashCodeEquals.useInstanceof auf true setzen, um den instanceof-Operator anstelle von Object.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
© . This website operates independently and is not affiliated with or endorsed by Microsoft. All brand names, logos, and trademarks are the property of their respective owners.