VS Code之Java代码重构和源代码操作

news2024/11/26 8:21:45

文章目录

    • 支持的代码操作列表
    • 调用重构
    • 分配变量
      • 字段和局部变量的差别
      • Assign statement to new local variable
      • 在有参构造函数中将参数指定成一个新的字段
    • 将匿名类转换为嵌套类
      • 什么是匿名类?
      • 匿名类转换为嵌套类的完整演示
    • 转换为Lambda表达式
      • Lambda 表达式是什么?
      • 转换为Lambda
    • 转换为匿名类创建
    • 转换为增强的 for 循环
    • 转换为静态导入
    • 提取常量
    • 内联常量
    • 提取到字段
    • 提取方法
    • 内联方法
    • 提取本地变量
    • 内联局部变量
    • 反转条件
    • 转换本地变量
    • 移动
    • 重命名
    • 源代码操作
      • 产生构造器
      • 产生代理方法
    • 重新/实现方法
    • 参考

VS Code提供了许多重构源代码的选项,以及在编码时生产代码和修改问题的源操作,使用的方式有两种:

  • 💡- 点击蓝灯泡
  • 右键单击编辑器视图,选择 Source Action

支持的代码操作列表

  • 重构
    • 分配变量
    • 将匿名类转为嵌套类
    • 转换为匿名类创建
    • 转换为增强的 for 循环
    • 转换为lambda表达式
    • 转换为静态导入
    • 提取重构
      • 提取为常量
      • 提取到字段
      • 提取到方法
      • 提取到局部变量
    • 内联重构
      • 内联常量
      • 内联局部变量
      • 内联方法
    • 反转布尔值
      • 反转条件
      • 反转局部变量
    • 移动
    • 重命名
    • 类型更改
      • 将解析类型更改为 var类型
      • 将var类型更改为已解析类型
    • 源代码操作
      • 生成构造函数
      • 生成委托方法
      • Override/implement 方法
      • 组织导入
      • 生成getter和setter
      • 生成hashCode()和equals()
      • 生成toString()
      • 将modifiers 更改为 final
  • 支持其他的代码操作
    • 修复不可访问的引用
    • 创建不存在的包

调用重构

重构命令在编辑器的上下文菜单中获取,选中需要重构的元素,右键单击打开上下文菜单,选择 Refactor...
在这里插入图片描述

分配变量

字段和局部变量的差别

  • Assign statement to new field
  • Assign statement to new local variable
    new field 是一个新的类的属性, new local variable 是一个新的本地变量。两者的差别的示例如下:

字段
asList 作为类的一个字段


public class Refactor {
    List<String> asList;

    public void assignToVar() {
       asList = Arrays.asList("Liu","Guan","Zhang");
    }

}

本地局部变量:
asList 作为方法体内的一个本地局部变量

public class Refactor {

    public void assignToVar() {
       List<String> asList = Arrays.asList("Liu","Guan","Zhang");
    }

}

Assign statement to new local variable

将一个表达式指定给局部变量或字段。
步骤:

  1. 选中代码
  2. 右键单击弹出菜单,点击 Refactor...
  3. 点击 “Assign statement to new local variable”
    在这里插入图片描述

重构前代码:

Arrays.asList("Liu","Guan","Zhang");

重构后的代码:

 List<String> asList = Arrays.asList("Liu","Guan","Zhang");

在有参构造函数中将参数指定成一个新的字段

在这里插入图片描述

点击 “Assign all parameters to new fields” 之后产生的代码如下:


public class Refactor {
    

    private String id;
    private String name;

    publicRefactor(String id,String name){
        this.id = id;
        this.name = name;
        
    }

注意:

  • 选中 name 或是 id之后, 点击前面的小黄灯会出现弹出菜单。

将匿名类转换为嵌套类

什么是匿名类?

什么是Java中的匿名类? 直接看示例代码:

public class AnonymousClass {

    interface Hello {
        void sayHello();
    }

    public static void main(String[] args) {
        // 使用匿名类创建Hello 接口的实例
        Hello hello = new Hello() {
            @Override
            public void sayHello() {
                System.out.println("Hello!");
            }
        };

        // 调用sayHello方法
        hello.sayHello();
    }
}

这里在类 AnonymousClass 定义了一个接口 Hello,该接口有一个接口方法 sayHello(),在创建Hello 接口实例的时候实现了sayHello()的方法。

匿名类是指在使用时直接定义的类,而不需要先定义类然后再使用。在Java中,匿名类的主要作用有:

  1. 简化代码
  2. 用于创建回调函数 (调用的时候再实现)

匿名类转换为嵌套类的完整演示

完整步骤:

  1. 首先有一个自定义的接口 MyInterface
    public interface MyInterface {

    }
  1. 接下来有一个获取接口示例的方法 getMyInterface(),在该方法中定义了类的方法hello()
    public MyInterface getMyInterface() {
        return new MyInterface() {
            public void hello() {
                System.out.println("Hello");
            }
        };
    }

完整的代码如下:

/**
 * Description:
 * Author: XM
 * Date: 2024-02-13
 */
package com.osxm.je.chp5.vscode;

public class AnonymousToNestedClass {

    public interface MyInterface {

    }

    public MyInterface getMyInterface() {
        return new MyInterface() {
            public void hello() {
                System.out.println("Hello");
            }
        };
    }
}

在这里插入图片描述

以上步骤之后在hello() 方法前面会出现蓝色小灯泡,也可以选择 hello() 之后右键单击,在弹出菜单中选择"Refactor…",再点击 “Convert anonymous to nested class”。点击完成产生的代码如下:

public class AnonymousToNestedClass {

    private final class MyInterfaceImplementation implements MyInterface {
        public void hello() {
            System.out.println("Hello");
        }
    }

    public interface MyInterface {
    }

    public MyInterface getMyInterface() {
        return new MyInterfaceImplementation();
    }
}

转换为Lambda表达式

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

Lambda 表达式是什么?

Lambda表达式是一种匿名函数,它可以在代码中以内联的方式定义和使用。Lambda表达式可以简洁地表示一个函数,通常用于需要函数作为参数或返回值的情况。Lambda表达式的语法比较简洁,由箭头符号 “->” 分隔左右两部分,左侧为参数列表,右侧为函数体。

Lambda表达式的一般形式为: (参数列表) -> 函数体

Lambda表达式可以有0个或多个参数,多个参数之间用逗号分隔。函数体可以是一个表达式,也可以是一个代码块。

Lambda表达式的特点包括:

  1. 匿名性:Lambda表达式没有名字,所以可以用作匿名函数。
  2. 简洁性:Lambda表达式可以简洁地表示一个函数,避免了定义命名函数的麻烦。
  3. 内联性:Lambda表达式可以在代码中直接定义和使用,不需要额外的函数定义和调用。

Lambda表达式常用于函数式编程中的高阶函数和匿名函数的编写,可以大大简化代码的编写和阅读。

在Java中,简言之, 接口只有一个需要被实现的方法,可以使用Lambda表达式,以线程接口 Runnable 为例,该接口只有一个run() 方法。线程类可以通过实现该接口,实现该类中的run()方法,看一个完整的示例:

/**
 * Description:
 * Author: XM
 * Date: 2024-02-14
 */
package com.osxm.je.chp5.vscode;

public class AnonyClassCreateToLambda {
    public Runnable myRunnable(){
        Runnable runnable = new Runnable(){
            @Override
            public void run(){
                System.out.println("Hello");
            }
        };
        return runnable;
    }

    public static void main(String[] args) {
        AnonyClassCreateToLambda  anonyToLambda = new AnonyClassCreateToLambda();
        Thread thread = new Thread(anonyToLambda.myRunnable());
        thread.start();
    }
}

转换为Lambda

选中 Runable 之后右键单击,在弹出的菜单中选中 “Convert to lambda expression”

在这里插入图片描述

转换后的lambda表达式如下:

    public Runnable myRunnable(){
        Runnable runnable = () -> System.out.println("Hello");
        return runnable;
    }

转换为匿名类创建

和上面的步骤相反, 使用VS Code 也可以将Lambda表达式转换为匿名类创建。

对于以下的Lambda表达式:

    public Runnable myRunnable(){
        Runnable runnable = () -> System.out.println("Hello");
        return runnable;
    }

选中Lambda表达式,右键单击,在弹出菜单中选择“Convert to lambda expression”。
在这里插入图片描述

转换后的匿名类创建的代码如下:

    public Runnable myRunnable(){
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello");
            }
        };
        return runnable;
    }

转换为增强的 for 循环

将简单的for 循环转换为 for-each 风格。
以如下的循环代码为例:

        List<String> list = Arrays.asList("1");
        for(int i =0;i<list.size();i++){
            System.out.println(list.get(i));
        }

在VS Code 中选中 for 的关键字之后右键单击,在弹出的菜单中选择"Convert to enhanced ‘for’ loop"。

在这里插入图片描述

转换后的代码如下:

        for (String element : list) {
            System.out.println(element);
        }

注意: 一定要选择 for 关键字才会在弹出菜单中出现"Convert to enhanced ‘for’ loop" 。

转换为静态导入

将字段或方法转换为静态导入。
这里以 Arrays 的asList() 方法为例, 初始化一个字符串的列表可以使用如下代码:

List<String> list = Arrays.asList("hello");

选中asList关键字之后右键单击 或者是点击前面的黄色小灯,在弹出的菜单中选择"Convert to static import"

在这里插入图片描述

转换后的代码如下:
在这里插入图片描述

提取常量

从选择的表达式创建一个静态的 final 字段并且替换。

以如下代码为例:

    public double getAreaAfter(double r) {
        return 3.14 * r * r;
    }

选取 3.14 之后单击右键,在弹出菜单中选中 “Extract to constant”

在这里插入图片描述

转换后的代码如下:

    private static final double _3_14 = 3.14;

    public double getAreaAfter(double r) {
        return _3_14 * r * r;
    }

内联常量

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

转换前:

    private static final double PI = 3.14;
    public double inlineConstantBefore(double r){
        return PI * r * r;
    }

选中上面的 PI之后,点击小黄灯之后选择 “Inline Constant”
在这里插入图片描述

转换后:

    public double inlineConstantAfter(double r){
        return 3.14 * r * r;
    }

提取到字段

定义一个新的字段并使用选择表达式初始化。
示例:
转换前:

    public void extractFieldBefore(){
        int height =1 ;
        int width = 2;
        int area = height * width;
    }

选中上面的 area 之后,右键单击或点击小黄灯之后选择"Extract to field"。
在这里插入图片描述

转换后:

    private int area;
    public void extractFieldAfter(){
        int height =1 ;
        int width = 2;
        area = height * width;
    }

提取方法

创建一个包含当前所选语句或表达式的新方法,并将所选内容替换为对新方法的引用。此功能对于清理冗长、杂乱或过于复杂的方法非常有用。

示例:
转换前:

    public void extractMethodBefore(){
        int height =1 ;
        int width = 2;
        int area = height * width;
    }

选中表达式之后,点击 “Extra to method”
在这里插入图片描述

    public void extractMethodAfter(){
        int height =1 ;
        int width = 2;
        getArea(height, width);
    }


    private void getArea(int height, int width) {
        int area = height * width;
    }

内联方法

将方法的调用替换为方法体。

示例:
转换前:

    public void inlineMethodBefore(){
        int height =1 ;
        int width = 2;
        int area = getArea(height,width);
    }
    private int getArea(int height,int width){
        return height * width;
    }

在这里插入图片描述

转换后:

    public void inlineMethodAfter() {
        int height = 1;
        int width = 2;
        int area = height * width;
    }

提取本地变量

创建指定给当前选定表达式的新变量,并使用对新变量的引用替换选定内容。
示例:
转换前:

    public void extraLocalVarBefore(String fruit){
        if("Apple".equals(fruit)){
          //
        }
    }

选中 "Apple".equals(fruit) ,点击小黄灯或右键单击,之后选择 “Extra to local variable”。

在这里插入图片描述

转换后的代码如下:

    public void extraLocalVarAfter(String fruit){
        boolean equals = "Apple".equals(fruit);
        if(equals){
          //
        }
    }

内联局部变量

用其初始值设定项替换冗余变量用法。

转换前:

    public void inlineLocalVarBefore(String fruit){
        boolean equals = "Apple".equals(fruit);
        if(equals){
          //
        }
    }

选中上面的equals 之后,点击小黄灯,选择 Inline local variable,

在这里插入图片描述

转换后:

    public void inlineLocalVarAfter(String fruit){
        if("Apple".equals(fruit)){
          //
        }
    }

反转条件

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

示例:
转换前:

    public void invertCondBefore(int value){
        if(value >1 && value <3){

        }
    }

选中条件表达式的内容,选中 “Invert conditions”:
在这里插入图片描述

转换后的内容:

    public void invertCondAfter(int value){
        if(value <= 1 || value >= 3){

        }
    }

转换本地变量

转换本地布尔变量。

示例:
转换前:

    public void invertLocalVarBefore(int value){
        boolean valid = value >1 && value <3;
    }

点击 valid 之后 ,点击小黄灯之后,选择"Invert local variable"。
在这里插入图片描述

转换后:

    public void invertLocalVarAfter(int value){
        boolean notValid = value <= 1 || value >= 3;
    }

移动

将选中的元素移动到指定位置(或是其他文件),可选择的动作:

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

示例:
转换前:

public class MoveBefore {

    public static void main(String[] args) {
        print();
    }

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

    static class Printer {

    }
}

选中需要移动的方法名,之后点击前面的小黄灯之后选择 “Move ‘print()’”
在这里插入图片描述

重命名

重命名选择的元素并更正所有引用。

类文件的命令可以有多种方式:

  1. 右键单击文件名,在弹出菜单选择 “Rename”
    在这里插入图片描述

  2. 在编辑器中选中类名, 按Fn + F2 键会弹出重命名的小窗口。
    在这里插入图片描述

源代码操作

源操作可用于生成通用代码结构和重复出现的元素。其中一些是快速修复程序,可以快速修复代码问题。

产生构造器

在编辑器中右键单击选中 “Source Action…”,选中 “Generate Constructors…”
在这里插入图片描述

接下来会选择构造器需要的参数

public class SourceAction {

    private String name;

    public SourceAction(String name) {
        this.name = name;
    }

}

产生代理方法

示例:
有一个代理类Delegate ,该类有一个代理方法 delegateMethod()。

public class Delegate {

    public void delegateMethod(){
        
    }
}

有一个接收类DelegateRecevier,该类中有一个Delegate类型的成员变量。

在这里插入图片描述

右键单击编辑器,选择 “Source Action…” 之后选择 “Generate Delegate Methods…”,之后可以选择需要产生的代理方法:

在这里插入图片描述

产生后的代码:

public class DelegateRecevier {

    private Delegate delegate;

    public void delegateMethod() {
        delegate.delegateMethod();
    }

}

重新/实现方法

选择 “Override/Implement Methods…”

在这里插入图片描述

参考

  • https://code.visualstudio.com/docs/java/java-refactoring


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1449124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OrangePi Zero2 智能家居】智能家居项目的软件实现

一、项目整体设计 二、项目代码的前期准备 三、实现语音监听接口 四、实现socket监听接口 五、实现烟雾报警监听接口 六、实现设备节点代码 七、实现接收消息处理接口 一、项目整体设计 整体的软件框架大致如下&#xff1a; 整个项目开启4个监听线程&#xff0c; 分别是&…

Java常用类与基础API--String的构造器与常用方法

文章目录 一、String的常用API-1&#xff08;1&#xff09;构造器1、介绍2、举例 &#xff08;2&#xff09;String与其他结构间的转换1、基本数据类型、包装类 --> 字符串2、字符串 --> 基本数据类型、包装类3、字符串 --> 字符数组4、字符数组 --> 字符串5、字符…

C++类和对象-C++运算符重载->加号运算符重载、左移运算符重载、递增运算符重载、赋值运算符重载、关系运算符重载、函数调用运算符重载

#include<iostream> using namespace std; //加号运算符重载 class Person { public: Person() {}; Person(int a, int b) { this->m_A a; this->m_B b; } //1.成员函数实现 号运算符重载 Person operator(const Per…

4核16G服务器价格腾讯云PK阿里云

4核16G服务器租用优惠价格26元1个月&#xff0c;腾讯云轻量4核16G12M服务器32元1个月、96元3个月、156元6个月、312元一年&#xff0c;阿腾云atengyun.com分享4核16服务器租用费用价格表&#xff0c;阿里云和腾讯云详细配置报价和性能参数表&#xff1a; 腾讯云4核16G服务器价…

JavaWeb学习|Filter与ThreadLocal

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 Filter 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是&#xff1a;Servlet 程序、Liste…

Oracle数据库自动维护任务(Automated Maintenance Tasks)

Oracle数据库自动维护任务(Automated Maintenance Tasks) Oracle数据库有以下预定义的自动维护任务: Automatic Optimizer Statistics Collection - 收集数据库中没有统计信息或只有过时统计信息的所有模式对象的优化器统计信息。SQL查询优化器使用该任务收集的统计信息来提高…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十)(2)(3)

实验十&#xff1a;非线性函数极值求解 练习二 1.求解极值问题: (1) s.t. function [c,ceq]fun(x) c(1)-(25-x(1)^2-x(2)^2); c(2)-(7-x(1)^2x(2)^2); ceq0;换一个窗口运行下面的程序&#xff1a; clc;clear; f(x)-2*x(1)-x(2); a[]; b[]; aeq[];beq[]; u[5;10]; l[0;0];…

一起玩儿Proteus仿真(C51)——06. 红绿灯仿真(二)

摘要&#xff1a;本文介绍如何仿真红绿灯 今天来看一下红绿灯仿真程序的具体实现方法。先来看一下整个程序的原理图。 在这个红绿灯仿真实验中&#xff0c;每个路口需要控制的设备是2位数码管显示倒计时以及红黄绿灯的亮灭。先来看一下数码管的连接方法。 数码管的8根LED显示…

解决Windows更新后无法启动的十种办法,总有一种适合你

你可能已经更新了操作系统以修复错误或使用最新功能。但是,如果Windows在更新后无法启动呢? 如果你面临这样的问题,主要是由于安装文件中的错误或你的系统与最新更新不兼容。此外,损坏的MBR或驱动程序也会阻止电脑启动。 不管是什么原因,本文将用十种简单的技术来指导你…

【蓝桥杯单片机入门记录】认识单片机

目录 单片机硬件平台 单片机的发展过程 单片机开发板 单片机基础知识 电平 数字电路中只有两种电平&#xff1a;高和低 二进制&#xff08;8421码&#xff09; 十六进制 二进制数的逻辑运算 “与” “或” “异或” 标准C与C51 如何学好单片机 端正学习的态度、培…

2024年云南省考报名详细流程图解,招聘5710人!

云南省考公告出来了&#xff01;招5710人&#xff01; ✔️报名时间&#xff1a;2024年2月19日9:00至2月23日18:00 ✔️缴费时间&#xff1a;2024年2月20日0:00至2月25日24:00 ✔️公共科目笔试时间为&#xff1a; 2024年3月16日上午 9:00&#xff0d;11:00 行政职业能力测验 2…

【leetcode热题100】不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;1 …

平时积累的FPGA知识点(7)

平时在FPGA群聊等积累的FPGA知识点&#xff0c;第七期&#xff1a; 11 描述扇出的xilinx官方文档是&#xff1f; 解释&#xff1a;ug949 12 在BD中如何指定某个IP用global&#xff0c;其他的用OOC模式&#xff1f;因为某个模块引用的IP带着XPM&#xff0c;综合不了 解释&am…

【MySQL】高度为2和3时B+树能够存储的记录数量的计算过程

文章目录 题目答案高度为2时的B树高度为3时的B树总结 GPT4 对话过程 题目 InnoDB主键索引的Btree在高度分别为 2 和 3 时&#xff0c;可以存储多少条记录&#xff1f; 答案 高度为2时的B树 计算过程&#xff1a; 使用公式 ( n 8 ( n 1 ) 6 16 1024 ) (n \times 8 …

ELAdmin 隐藏添加编辑按钮

使用场景 做了一个监控模块&#xff0c;数据都是定时生成的&#xff0c;所以不需要手动添加和编辑功能。 顶部不显示 可以使用 true 或者 false 控制现实隐藏 created() {this.crud.optShow {add: false,edit: false,del: true,download: true,reset: true}},如果没有 crea…

python守护进程--supervisor 使用教程

supervisor 使用教程python守护进程1.安装 pip3 install supervisor -i https://pypi.tuna.tsinghua.edu.cn/simple 2.使用supervisor 启动 python main.py 文件 vim /etc/supervisor/conf.d/demo.conf添加以下内容&#xff1a;[program:demo] #项目名称为democommandp…

oppo手机QQ上传文件所在位置

一、打开手机“文件管理”APP 点击“点击查看”&#xff0c;按钮&#xff0c;会进入到新的根目录。 寻找下面的目录进入

StarUML无法安装扩展的解决方案

StarUML无法安装扩展解决方案 版本&#xff1a;StarUML3.2.2 遇到问题 Unable to access the extension registry, Please try again later. 解决方案 第一步 https://docs.staruml.io/user-guide/managing-extensions#install-extension官网给了怎么手动安装扩展器的方法…

【leetcode】深搜、暴搜、回溯、剪枝(C++)2

深搜、暴搜、回溯、剪枝&#xff08;C&#xff09;2 一、括号生成1、题目描述2、代码3、解析 二、组合1、题目描述2、代码3、解析 三、目标和1、题目描述2、代码3、解析 四、组合总和1、题目描述2、代码3、解析 五、字母大小写全排列1、题目描述2、代码3、解析 六、优美的排列1…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱5(附带项目源码)

效果演示 文章目录 效果演示系列目录前言制作系统定义制作配方 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、制…