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

文章目录

    • 支持的代码操作列表
    • 调用重构
    • 分配变量
      • 字段和局部变量的差别
      • 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() {@Overridepublic 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(){@Overridepublic 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() {@Overridepublic 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.mzph.cn/news/682816.shtml

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

相关文章

[缓存] - 1.缓存共性问题

1. 缓存的作用 为什么需要缓存呢&#xff1f;缓存主要解决两个问题&#xff0c;一个是提高应用程序的性能&#xff0c;降低请求响应的延时&#xff1b;一个是提高应用程序的并发性。 1.1 高并发 一般来说&#xff0c; 如果 10Wqps&#xff0c;或者20Wqps &#xff0c;可使用分布…

数据库实验报告

用SQL语句和企业管理器建立如下的表结构并输入数据 给定表结构如下&#xff1a; 创建数据库 创建数据库 create table student(Sno int auto_increment primary key,Sname varchar(45),Ssex varchar(45),Sage int,Sdept varchar(45) )engine InnoDB default charsetutf8; …

Ubuntu下Anaconda+PyCharm搭建PyTorch环境

这里主要介绍在condapytorch都正确安装的前提下&#xff0c;如何通过pycharm建立开发环境&#xff1b; Ubuntu下AnacondaPyCharm搭建PyTorch环境 系统环境&#xff1a;Ubuntu22.04 conda: conda 23.11.0 pycharm:如下 condapytorch的安装教程介绍&#xff0c;请点击这里&…

jmeter-问题四:json断言时,预期结果那里如何不写成固定值?

文章目录 json断言时&#xff0c;预期结果那里如何不写成固定值&#xff1f;定义用户参数&#xff0c;然后在json断言的expected value处引用使用csv数据&#xff0c;然后在json断言的expected value处引用 json断言时&#xff0c;预期结果那里如何不写成固定值&#xff1f; 定…

软件实例分享,茶楼收银软件管理系统,支持计时计费商品销售会员管理定时语音提醒功能

软件实例分享&#xff0c;茶楼收银软件管理系统&#xff0c;支持计时计费商品销售会员管理定时语音提醒功能 一、前言 以下软件教程以 佳易王茶社计时计费管理系统软件V18.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 问&#xff1a;这个软…

腾讯云4核8G服务器多少钱?

腾讯云4核8G服务器多少钱&#xff1f;轻量应用服务器4核8G12M带宽一年446元、646元15个月&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;在txy.wiki可以查询详细配置和精准报价…

arkTS开发鸿蒙OS个人商城案例【2024最新 新年限定开发案例QAQ】

龙年前述 源码获取>文章下方二维码&#xff0c;回复关键字“鸿蒙OS商场源码” 前言 arkTS是华为自己研发的一套前端语言&#xff0c;是在js和ts技术的基础上又进行了升级而成&#xff01; 本篇文章会带领大家通过arkTSnode.jsmongoDB来完成一个鸿蒙OS版本的商城案例&…

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

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

大模型Layer normalization知识

Layer Norm 的计算公式 Layer Norm&#xff08;层归一化&#xff09;是一种用于神经网络中的归一化技术&#xff0c;用于提高模型的训练效果和泛化能力。 RMS Norm 的计算公式 RMS Norm 的作用是通过计算输入 X 的均方根&#xff0c;将每个样本的特征进行归一化&#xff0c;使…

AD域国产替代方案,助力某金融企业麒麟信创电脑实现“真替真用”

近期收到不少企业客户反馈采购的信创PC电脑用不起来&#xff0c;影响信创改造的进度。例如&#xff0c;某金融企业积极响应国产化信创替代战略&#xff0c;购置了一批麒麟操作系统电脑。分发使用中发现了如下问题&#xff1a; • 当前麒麟操作系统电脑无法做到统一身份认证&…

【Java】零基础蓝桥杯算法学习——线性动态规划(一维dp)

线性dp——一维动态规划 1、考虑最后一步可以由哪些状态得到&#xff0c;推出转移方程 2、考虑当前状态与哪些参数有关系&#xff0c;定义几维数组来表示当前状态 3、计算时间复杂度&#xff0c;判断是否需要进行优化。 一维动态规划例题&#xff1a;最大上升子序列问题 Java参…

面试技术栈 —— 2024网易雷火暑期实习真题

面试技术栈 —— 2024网易雷火暑期实习真题 1. 最长递增子序列。2. 集中限流和单机限流你觉得哪个好&#xff1f;3. redis部署服务器配置&#xff0c;为什么不用哨兵&#xff1f;4. 讲讲分布式session的原理。5. 数据库&#xff1a;表数据量大了&#xff0c;如何分表&#xff1…

Python 读取pdf文件

Python 实现读取pdf文件简单示例。 安装命令 需要安装操作pdf的三方类库&#xff0c;命令如下&#xff1a; pip install pdfminer3K 安装过程如下&#xff1a; 引入类库 需要引入很多的类库。 示例如下&#xff1a; import sys import importlib importlib.reload(sys)fr…

cordic算法圆周系统计算sin、cos、平方和开根、atan、坐标系变换

cordic算法圆周系统计算sin、cos、平方和开根、atan 一、cordic圆周系统旋转模式和向量模式1.1 旋转模式1.2 向量模式 二、一些需要考虑的事项2.1角度范围2.2输入正负2.3关于迭代精度2.4坐标系旋转 参考文献&#xff1a; 若想计算 s i n sin sin、 c o s cos cos、 x 2 y 2 \s…

【MySQL】索引事务

MySQL索引事务 1. 索引1.1 概念1.2 作用1.3 使用场景1.4 使用1.5 案例 2. 事务2.2 事物的概念2.3 使用 3. 内容重点总结 1. 索引 1.1 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类…

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

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

算法学习——LeetCode力扣回溯篇2

算法学习——LeetCode力扣回溯篇2 40. 组合总和 II 40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字…

Qt 的准备知识

文章目录 1. Qt 背景介绍2. 搭建 Qt 开发环境3. 认识 Qt Creator3.1 main.cpp3.2 widget.h3.3 widget.cpp3.4 Forms3.5 .pro文件 1. Qt 背景介绍 Qt 是⼀个 跨平台的 C 图形用户界面应用程序框架 。它为应用程序开发者提供了建立艺术级图形界⾯所需的所有功能。它是完全⾯向对…

Docker 在window 2024版笔记 下载 安装 操作 配置

---Docker 前言--- Docker windows版官方版是一款专业开源的应用容器引擎&#xff0c;可以加快用户构建、共享和运行现代应用程序的速度&#xff0c;支持运行Linux和Windows Docker容器。 Docker 在容器的基础上&#xff0c;进行了进一步的封装&#xff0c;从文件系统、网络互…

关于Windows Media Player的一些知识,看这篇文章就差不多了

你知道如何在电脑上打开Windows Media Player吗?如果它不是你电脑上默认的媒体播放器,你知道如何将其设为默认吗?此外,如果你找不到它,你知道怎么把它找回来吗?这篇文章将向你展示你想要了解的所有信息。 在这篇文章中,我们将向你展示以下信息: 如何打开Windows Medi…