本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

Java 代码重构和源代码操作

Visual Studio Code 提供了许多选项来重构您的源代码以及在编码时生成代码和修复问题的 Source Actions。要访问它们,请点击灯泡 💡 每当您看到它时。或右键单击编辑器视图并选择 源操作....

支持的代码操作列表

重构

Java程序重构的目标是在不改变程序行为的情况下进行系统范围的代码更改。VS Code 的 Java 语言支持提供了许多易于访问的重构选项。

调用重构

重构命令可以从编辑器的上下文菜单中找到。选择您想要重构的元素,右键单击以打开上下文菜单,并选择重构...:

调用重构

然后您将看到所有可用的重构选项。

分配给变量

将表达式分配给局部变量或字段。

示例

之前
数组.asList("苹果", "柠檬", "香蕉");
之后
列表<字符串> 水果 = 数组.asList("苹果", "柠檬", "香蕉");

它也可以用于将参数分配给构造函数中未使用的参数的新字段。

将匿名转换为嵌套类

将匿名内部类转换为成员类。

示例

让我们将匿名类转换接口(){...}给班上的成员班级输入:.

之前
公共 Clazz {
  公共 接口 方法() {
    最终 布尔  isValid = ;
    返回 接口() {
      公共 布尔  isValid() {
        返回  isValid;
      }
    };
  }
}
之后
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;
    }
  }

  公共 接口 方法() {
    最终 布尔  isValid = ;
    返回 我的接口(isValid);
  }
}

转换为匿名类创建

将lambda表达式转换为匿名类创建。

示例

变量可运行的被分配了一个lambda表达式。让我们将其转换为匿名类创建。

之前
公共 无返回值 方法(){
  可运行 可运行对象 = () -> {
    // 做一些事情
  };
}
之后
公共 无返回值 方法(){
  可运行接口 可运行实例 = 新的 可运行接口(){
    @覆盖
    公共 无返回值 运行(){
      // 做一些事情
    }
  };
}

另见:转换为lambda表达式

转换为增强的 for 循环

转换简单的对于循环到对于-每个风格。

示例

之前
公共 无返回值 订单(字符串数组
  书籍) {  for (整数索引 = 0; 索引 < 书籍.数组长度
    ; 索引++) {
  // 做一些事情
  }
之后
公共 无返回值 订单(字符串数组
  书籍) {  对于 (字符串 :
    书籍) {
  // 做一些事情
  }

转换为lambda表达式

将匿名类创建转换为lambda表达式。

示例

让我们将匿名类转换Runnable(){...}到一个lambda表达式。

之前
公共 无返回值 方法(){
  可运行接口 runnable = 新的 可运行接口(){
    @覆盖
    公共 无返回值 运行() {
      // 做一些事情
    }
  };
}
之后
公共 无返回值 方法(){
    可运行接口 可运行实例 = () ->{
      // 做一些事情
    };
  }

另见:转换为匿名类创建

转换为静态导入

将字段或方法转换为静态导入。

示例

让我们改变断言assertEquals()对静态导入的调用。

之前
导入 org.junit.Assert;
...
公开 void 测试() {
  断言.assertEquals(预期, 实际);
}
之后
导入静态 org.junit.Assert.assertEquals;
...
公共 无返回值 测试() {
  assertEquals(预期值, 实际值);
}

提取到常量

从选定的表达式创建一个静态最终字段,并替换字段引用,然后重新编写其他出现相同表达式的地方。

示例

让我们提取圆周率的值:3.14到一个常数。

之前
公共 双精度 获取面积(双精度 半径) {
  返回 3.14 * 半径 * 半径;
}
之后
私有 静态 最终 双精度 圆周率 = 3.14;

公共 双精度 获取面积(双精度 r) {
  返回 PI * r * r;
}

另见:内联常量

提取到字段

声明一个新字段并用所选表达式初始化它。原始表达式被字段的使用所取代。

示例

让我们提取变量区域到类的一个字段广场输入:.

之前
 Square {
  公共  void calculateArea() {
    int 高度 = 1;
    int 宽度 = 2;
    int 面积 = 高度 * 宽度;
  }
}
之后
 Square {
  私有 整数 area;

  公共  void  calculateArea(){
    int  height  = 1;
    int  width  = 2;
    area = height * width;
  }
}

选择变量声明时,将变量转换为字段。

提取到方法

创建一个新的方法,包含当前选中的语句或表达式,并用对该新方法的引用替换选择。这个功能对于清理长度过长、杂乱无章或过于复杂的的方法很有用。

示例

让我们提取表达式高度 * 宽度到一种新方法。

之前
公共 无返回值 方法(){
  整数 高度 = 1;
  整数 宽度 = 2;
  整数 面积 = 高度 * 宽度;
}
之后
公共 无返回值 方法(){
  整数 高度 = 1;
  整数 宽度 = 2;
  整数 面积 = 获取面积(高度, 宽度);
}

私有 整数 获取面积(整数 高度, 整数 宽度) {
  返回 高度 * 宽度;
}

另见:内联方法

提取到局部变量

创建一个新变量,将其分配给当前选定的表达式,并用新变量的引用替换选定内容。

示例

让我们提取表达式平台.equalsIgnoreCase("MAC")到一个新的变量。

之前
公共 无返回值 方法(){
  如果(平台.equalsIgnoreCase("MAC")){
    // 做一些事情
  }
}
之后
公共 无返回值 方法(){
  布尔  isMac = 平台.equalsIgnoreCase("MAC");  如果
  (isMac) {    // 做一些事情
    }
  }

在提取之后,您还可以在同一个事务中执行重命名。

另见:内联局部变量

内联常量

将常量引用替换为其定义值。

示例

让我们替换常量圆周率到其定义值:3.14输入:.

之前
私有 静态 最终 双精度 圆周率 = 3.14;

公共 双精度 获取面积(双精度 r) {
  返回 PI * r * r;
}
之后
私有 静态 最终 双精度 圆周率 = 3.14;

公共 双精度 获取面积(双精度 半径) {
  返回 3.14 * 半径 * 半径;
}

另见: 提取为常量

内联局部变量

将多余变量的使用替换为其初始化值。

示例

让我们替换变量是否是Mac直接转换为布尔表达式。

之前
公共 无返回值 方法(){
  布尔  isMac = 平台.equalsIgnoreCase("MAC");  如果
  (isMac) {    // 做一些事情
    }
  }

之后
公共 无返回值 方法(){
  如果(平台.equalsIgnoreCase("MAC")){
    // 做一些事情
  }
}

另见:提取到局部变量

内联方法

将对方法的调用替换为该方法的主体。

示例

让我们替换这个方法获取面积(int 高度, int 宽度)直接表达高度 * 宽度输入:.

之前
公共 无返回值 方法(){
  整数 高度 = 1;
  整数 宽度 = 2;
  整数 面积 = 获取面积(高度, 宽度);
}

私有 整数 获取面积(整数 高度, 整数 宽度) {
  返回 高度 * 宽度;
}
之后
公共 无返回值 方法(){
  整数 高度 = 1;
  整数 宽度 = 2;
  整数 面积 = 高度 * 宽度;
}

另见:提取到方法

反转条件

反转条件中的布尔表达式。

示例

让我们反转if语句中的布尔表达式。

之前
公共 无返回值 方法(整数 值) {
  如果 (值 > 5 并且 值 < 15) {
    // 做一些事情
  }
}
之后
公共 无返回值 方法(整数 值) {
  如果 (值 <= 5 或 值 >= 15) {
    // 做一些事情
  }
}

反转局部变量

反转局部布尔变量。

示例

让我们反转变量有效输入:.

之前
公共 无返回值 方法(整数 值) {
  布尔 有效 = 值 > 5 && 值 < 15;
}
之后
公共 无返回值 方法(整数 值) {
  布尔 无效 = 值 <= 5 || 值 >= 15;
}

移动

移动选定的元素并更正所有元素的引用(包括其他文件中的引用)。可用操作为:

  • 将类移动到另一个包
  • 将静态或实例方法移动到另一个类
  • 将内部类移动到一个新的文件

示例

让我们移动静态方法打印()来自课堂办公室去上课打印机输入:.

之前
公共 Office {
  公共 静态(字符串[] 参数) {
    打印();
  }

  公共 静态 无返回值 打印(){
    系统.输出.打印行("这是一个打印机");
  }

  静态 打印机 { }
}
之后
公共 Office {
  公共 静态 无返回值(字符串[] 参数) {
    打印机.打印();
  }

```plaintext
static class Printer {
    public static void print() {
        System.out.println("This is printer");
    }
}
```





将静态方法的提取重构移动到另一个类中,如果该方法在另一个类中被使用得比在其自身类中更多。

将类移动到另一个包。目前,文件资源管理器不支持从文件资源管理器中移动引用。

将内部类移动到一个新的文件。

重命名

默认快捷键:F2

重命名选定的元素并更正所有对该元素的引用(包括其他文件中的引用)。

示例

让我们重命名这个类输入:Foo酒吧

之前
公共 Foo {
  // ...
}

公共 无返回值 我的方法(){
  Foo 我的类 = 新的 Foo;
}
之后
公共 Bar {
  // ...
}

公共 无返回值 我的方法(){
  Bar 我的类 = 新的 Bar ();
}

调用重命名重构的快捷键是F2。当你在编辑器中对标识符调用该快捷键时,编辑器本身会显示一个小框,你可以在其中更改标识符名称。当你按回车键时,所有对该标识符的引用也会被更改。

重命名重构也支持通过文件资源管理器对文件和文件夹进行操作。在请求更改后,将提供受影响文件的预览,并且您可以决定如何应用这些更改。

从资源管理器重命名

将已解决类型更改为变量类型

用途变量声明局部变量。

示例

之前
字符串 s = "";
之后
变量 s = "";

另见:将变量类型更改为已解决类型


将变量类型更改为已解析类型

使用已解析的类型来声明局部变量。

示例

之前
变量 s = "";
之后
字符串 s = "";

另见:将已解决的类型更改为变量类型

源操作

源操作可以用来生成常见的代码结构和重复的元素。其中一些是快速修复,帮助您实时修复代码问题。

生成构造函数

为该类添加一个构造函数。

生成代理方法

生成代理方法

覆盖/实现方法

通过此源操作,所有候选人都会以清单的形式呈现给您。然后您可以决定要覆盖或实施哪些内容。

组织进口

您可以使用此源操作来清理您的导入。它也可以处理模棱两可的导入,在这种情况下,将呈现下拉列表供您选择正确的导入。同时也会呈现包含未解析类型的相关代码行以帮助您做出决定。

生成获取器和设置器

您可以批量生成所有新成员变量的getter和setter。如果类有多个字段,Source Action将提示您快速选择要用于生成访问器方法的目标字段。

生成hashCode()等于()

hashCode()等于()可以通过默认实现生成。所有非静态成员变量都已列出,您可以使用检查表定制生成的代码。

有两种选项可以自定义生成的代码:

  • 如果你使用Java 7+,你可以设置java.代码生成.hashCodeEquals.使用Java7对象生成更短的代码调用对象.哈希对象相等输入:.
  • 你也可以设置java.代码生成.hashCodeEquals.使用instanceof使用实例操作符来检查对象类型,而不是调用Object.getClass()输入:.

生成toString()

有一个新的源操作来生成toString()方法。通过检查所有成员变量的清单可以进行定制。

尽可能将修饰符更改为 final

添加最终将修饰符应用于当前源文件中的所有变量和参数。

示例

之前
公共 Clazz {
  公共  void  方法(整数) {
    布尔 无效 = 值 > 5;
    如果 (无效) {
      // 做一些事情
    }
  }
}
之后
公共 Clazz {
  公共  void  方法(最终  int  value) {
    最终  boolean  notValid  = value > 5;
    如果 (notValid) {
      // 做一些事情
    }
  }
}

修正不可访问的引用

这个快速修复帮助你修复无法访问的引用。

创建不存在的包

当你的包名与文件夹名不匹配时,你可以选择在源代码中更改包名,或者在文件系统中移动文件夹(即使目标文件夹尚不存在)。

其他代码操作支持

VS Code 支持的代码操作列表不断增长,并且只列出最受欢迎的几个。其他值得注意的支持操作包括(但不限于):

  • 创建未解决的类型
  • 移除最终修饰符
  • 移除不必要的类型转换
  • 移除冗余接口
  • 在 switch 语句中添加缺失的 case 标签
  • 跳转到中断/继续的定义
  • 正确访问静态元素