ist jetzt verfügbar! Lesen Sie über die neuen Funktionen und Fehlerbehebungen vom November.

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

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....

Invoke Refactoring

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.

Rename from Explorer

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.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 zu verwenden, um die Objekttypen zu überprüfen, anstatt Object.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
© . This site is unofficial and not affiliated with Microsoft.