在IntelliJ下使用instance method替换static method

IntelliJ IDEA中GitHub Copilot深度实战指南 GitHub Copilot 是一款基于大语言模型的AI编程助手,其核心能力源于对代码语义、项目上下文与开发意图的联合建模。不同于传统补全工具,它通过分析AST抽象语法树、IDE索引信息及自然语言指令,实现上下文感知补全、跨文件引用生成与智能重构建议。在IntelliJ IDEA中,Copilot的价值不仅体现为效率提升,更在于倒逼开发者强化命名规范、注释质量与架构清晰度——这正是其区别于VS Code等轻量编辑器的关键技术优势。本文聚焦Java/Spring Boot/Kotlin真实工程场景,详解安装适 阅读详情

大家都知道在绝大多数情况下,我们都不应该是用static方法。但如果真的有了,比如说是在遗留系统中有这样的代码,我们应该怎么样“安全”的重构呢?

给一个简单的例子,假设我们有一个类叫做MyMath,代码如下:

MyMathTest.java

public class MyMathTest {
    @Test
    public void shouldReturnSumOfTwoNumbersWhenAdd() {
        assertThat(MyMath.add(1, 1), is(2));
    }
}

MyMath.java

public class MyMath {
    public static int add(int a, int b) {
        return a + b;
    }
}


方法一:手动替换

1.拷贝static方法的body到另一个临时方法里

MyMath.java
public class MyMath {
    public static int add(int a, int b) {
        return a + b;
    }

    public int add2(int a, int b) {
        return a + b;
    }
}

2.delegate方法调用

public static int add(int a, int b) {
        return new MyMath().add2(a, b);
}

3. inline static方法

public class MyMath {

    public int add2(int a, int b) {
        return a + b;
    }
}

public class MyMathTest {
    @Test
    public void shouldReturnSumOfTwoNumbersWhenAdd() {
        assertThat(new MyMath().add2(1, 1), is(2));
    }
}

这样就达到了替换的目的。

4. 重命名add2到add,完


方法二:intellij的convert to instance method

1.改变方法签名(Command/Ctrl + F6),传入一个MyMath的instance

public class MyMath {
    public static int add(int a, int b, MyMath myMath) {
        return a + b;
    }
}

public class MyMathTest {
    @Test
    public void shouldReturnSumOfTwoNumbersWhenAdd() {
        assertThat(MyMath.add(1, 1, new MyMath()), is(2));
    }
}

2.使用intellij的convert to instance method

选中add,然后在refactor中选中convert to instance method。


在弹出的窗口中选择instance parameter为myMath。


然后就大工告成:

public class MyMath {
    public int add(int a, int b) {
        return a + b;
    }
}

public class MyMathTest {
    @Test
    public void shouldReturnSumOfTwoNumbersWhenAdd() {
        assertThat(new MyMath().add(1, 1), is(2));
    }
}


总结:

在开始学重构的时候,最好是从手动重构开始,包括最简单的提取方法这些,都最好从手动开始,到后面,你重复了足够次数以后,尽量采用IntelliJ的自动重构来进行重构

Lombok编译期代码生成原理与Java开发提效实践 Lombok是一种基于JSR-269注解处理器规范的编译期代码生成工具,它在javac编译阶段动态注入getter/setter/toString/equals/hashCode等模板代码,不依赖反射、不增加运行时开销,显著降低Java样板代码(boiler plate code)编写量。其核心价值在于提升开发效率与代码一致性,广泛应用于Spring Boot、Maven/Gradle构建的Java 8+项目中,尤其适合DTO、VO、Entity等数据载体类的快速建模。通过@Data、@Builder、@S 阅读详情

相关推荐

Datagrip连接Oracle报RemoteServer错误的根因排查指南

Datagrip连接Oracle时出现'Class not found: com.intellij.execution.rmi.RemoteServer'错误,常被误判为JDBC驱动缺失,实则源于IDE底层进程间通信(IPC)机制启动失败。该问题本质是Java运行时环境、JVM安全参数与操作系统网络策略三者协同异常所致,核心涉及RMI类加载、JBR兼容性及codebase安全策略等基础机制。其技术价值在于揭示了现代IDE沙箱化连接模型的运行依赖,适用于所有基于IntelliJ Platform的工具(如ID

weixin_34151004的博客 605

JAVA中的static调用非static方法的几点注意

1、由JVM的执行机制决定了在static方法中是不能直接调用改类的其它非static方法的。   因为类方法(static方法)执行的时候,其所在的堆栈中是没有指向对象的引用的任何信息的,而非static方法在调用的时候又必须要知道调用该方法的对象的引用。所以从这里可以看出,static方法中是没有办法直接调用非static方法的。   从另外一方面来讲,static方法中是不存在this的

Note 4427

Java字节码操作实战:基于ByteBuddy的Aspose.Words逆向工程与许可证机制分析

Java字节码操作是深入理解JVM运行机制和软件保护原理的核心技术。通过操作.class文件的字节码指令,开发者可以动态修改程序行为,实现性能监控、热修复等高级功能。其技术价值在于提供了对已编译Java程序的深度控制能力,广泛应用于APM系统、单元测试增强和动态代理等场景。本文以Aspose.Words的许可证验证机制为具体案例,详细演示了如何结合ByteBuddy框架进行字节码分析和修改,其中涉及Java Agent技术和类加载机制的关键应用,为学习软件逆向工程和运行时程序修改提供了实践参考。

weixin_33743703的博客 394

Write to static field from instance method

描述:Write to static field 通过实例方法更新静态属性 This instance method writes to a static field. This is tricky to get correct if multiple instances are being manipulated, and generally bad practice. 常见于常量类,直接通过...

horncui的博客 7069

5分钟上手BurpSuite Montoya API:构建自定义Proxy拦截器

HTTP/HTTPS代理是Web安全测试与渗透测试的核心技术,它通过在客户端与服务器之间建立中间人角色,实现对网络流量的捕获、分析与修改。其工作原理是拦截并转发数据包,使测试人员能够深入观察和操纵应用层协议。这项技术的核心价值在于提供了对Web应用交互过程的深度可见性与可控性,是自动化安全审计、漏洞挖掘和协议分析的基础。在实际应用场景中,安全工程师常需对流量进行定制化处理,例如自动修改请求参数、注入测试载荷或基于响应触发后续操作。针对此类需求,BurpSuite Montoya API作为新一代官方扩展接口

weixin_30723433的博客 339

Java核心基础深度解析:从JVM内存到并发编程的实战内功

在Java开发领域,扎实的基础知识是构建稳定、高效应用系统的基石。理解JVM内存模型是掌握Java程序运行原理的关键,它决定了对象如何分配、内存如何回收,是排查OutOfMemoryError等线上问题的核心依据。集合框架作为日常开发中最常用的API,其内部实现原理直接影响程序性能与线程安全,例如HashMap的负载因子设计、ConcurrentHashMap的锁机制优化,都体现了在空间与时间、性能与安全之间的精妙权衡。并发编程则涉及多线程环境下的原子性、可见性与有序性问题,volatile关键字、sync

weixin_33851604的博客 440

sonar findbugs:Write to static field from instance method

非静态方法对静态对象操作是不安全的。

进击的小白 752

Java反序列化漏洞剖析:Apache Commons Collections利用链CC1原理与实战

Java反序列化是一种将字节流恢复为对象的核心机制,其原理在于反序列化过程中会自动调用对象的readObject方法。这一特性在带来便利的同时,也引入了严重的安全风险,攻击者通过控制反序列化数据,可触发恶意逻辑执行。其技术价值在于揭示了通用库中灵活组件组合可能引发的远程代码执行(RCE)漏洞,广泛应用于Web应用、中间件等场景。本文聚焦于Apache Commons Collections库中的经典利用链CC1,深入拆解其如何通过Transformer链与动态代理机制,在特定条件下实现命令执行,并融入反序列

weixin_30530939的博客 404

关于Write to static field from instance method的修正问题

最近使用Find Bugs,经常遇到这个bug是说在实例方法中不能直接对static成员进行赋值,当创建多个实例时,多个实例调用该方法会造成一些不可预知的隐患。 查阅了很多资料,对于这个问题的修正有两种方法, 第一个是去掉成员变量的static,另一个是把在实例方法中通过setter方法来改变static变量。 那么问题来了,到底谁家挖掘机比较强(不对…… 在第二个方法中,通过

8808

Unity热更新实战:基于XLua的C#+Lua稳健架构设计与避坑指南

热更新技术是现代游戏开发,尤其是移动游戏在线运营中的核心需求,它允许开发者在无需重新发布客户端的情况下修复Bug或更新内容,从而显著减少用户流失。其原理通常是在原生代码(如C#)之上构建一个动态脚本层(如Lua),通过运行时替换或注入逻辑来实现更新。这项技术的核心价值在于为项目提供了快速响应线上问题的能力,是保障游戏长期稳定运营的关键。在实际应用场景中,如何在Unity引擎内构建一个稳健、可维护的C#与Lua混合架构,是许多团队面临的挑战。本文聚焦于**XLua热补丁**这一精准修复方案,深入探讨其实现机制

weixin_33831196的博客 672

SpringCloud微服务核心组件Eureka与Nacos实战指南

微服务架构通过将单体应用拆分为独立部署的小型服务,显著提升了系统的可扩展性和开发效率。服务注册与发现作为微服务通信的基础设施,其核心原理是通过注册中心维护服务实例的动态目录。SpringCloud生态提供了Eureka和Nacos两种主流解决方案,其中Eureka采用AP模型保证高可用,而Nacos支持AP/CP模式切换并集成配置管理功能。在电商、金融等分布式系统中,配合Ribbon或SpringCloud LoadBalancer实现客户端负载均衡,能够有效提升系统吞吐量。本文通过电商项目实战,详细解析服

weixin_33868027的博客 408

IDEA代码重构技巧--迁移

在代码重构和检视过程中,比较常见的是一个类或者方法职责不单一,导致代码有坏味道,这种情况就需要基于函数抽取,迁移来做代码重构,而迁移意味着调用点也需要同步修改,仅靠手动拷贝工作量大且易出错,此时就可以借助IDEA的重构能力。

左撇子帕布 8979

基于Netty构建高性能WebSocket服务器:从原理到实战部署

WebSocket作为一种在单个TCP连接上进行全双工通信的协议,通过建立持久连接实现了服务端到客户端的主动数据推送,相比传统HTTP轮询显著降低了网络开销与通信延迟。其核心原理基于HTTP协议升级机制,在完成握手后转为二进制帧传输,特别适合需要实时双向数据交换的场景。在技术选型层面,Netty凭借其异步事件驱动的Reactor线程模型、零拷贝技术和高效内存管理,成为构建高并发WebSocket服务的首选框架,能够轻松应对海量连接下的性能挑战。结合心跳检测、连接管理等机制,基于Netty的WebSocket

weixin_34210740的博客 376

REA IDA适配器一文讲清:它为什么绝不保存你的数据库

它能在 IDA 里反编译、搜字符串,却唯独拒绝替你保存数据库。REA 是一个用 MCP 把 AI Agent 与逆向引擎接起来的开源项目,它的 IDA 适配器提供两种生命周期模式:`attached` 附着到你已打开的 GUI,`headless` 独立做无头分析。 [![REA IDA适配器实时只读分析界面](https://raw.gitcode.com/GitHub_Trending/re

gitblog_00506的博客 652

基于Web的智能家居(源码+开题)

实践上,智能家居系统的普及和应用将极大改善人们的居住体验,提高生活质量,同时也有助于促进智能家居产业链的发展和完善,为社会经济发展注入新的活力。此外,本研究还将对基于Web的智能家居系统的用户体验进行深入研究,通过用户调研和数据分析,不断优化系统功能和界面设计,提升用户的使用体验和满意度。针对以上问题,本研究将综合运用物联网、云计算、大数据等新一代信息技术,通过系统架构设计、功能模块开发、安全性保障、用户体验优化等多个方面的研究工作,力求为基于Web的智能家居系统的研发和应用提供全面而有效的解决方案。

sryue06的博客 1902

Monocle2在R 4.3环境下的终极避坑指南:从安装到可视化全流程解析

本文提供了在R 4.3环境下安装和运行Monocle2的完整解决方案,重点解决了依赖包兼容性、源码修改及BEAM分析报错等关键问题。文章详细解析了从环境准备、依赖包处理、源码安装验证到从Seurat对象转换、拟时轨迹构建、高级可视化及性能优化的全流程,旨在帮助用户顺利完成单细胞拟时分析。

weixin_29206669的博客 1353

Java开发从入门到精通:环境配置与核心语法详解

Java作为面向对象编程语言的代表,凭借JVM跨平台特性和完善的生态系统,在企业级开发中占据重要地位。其核心原理包括类型系统、内存管理和多线程机制,通过垃圾回收器和字节码技术实现高效运行。在金融、电商等高性能场景中,Java的并发处理能力和丰富的框架支持(如Spring)展现出显著技术价值。本文以Java 17 LTS版本为例,详解JDK环境搭建、IDE优化配置等工程实践,并涵盖SOLID设计原则、JVM内存结构等进阶知识,帮助开发者系统掌握Java技术栈。

weixin_34025151的博客 391

电子元器件选型与实战应用—01 电阻选型

大家好, 我是记得诚。这是《电子元器件选型与实战应用》专栏的第一篇文章,今天的主角是电阻,在每一个电子产品中,都少不了电阻的身影,其重要性不言而喻。

记得诚 3536

Java从零到入门:30小时实战指南与核心技巧

Java作为企业级开发的主流语言,其'一次编写,到处运行'的特性使其在金融、电商等领域广泛应用。理解Java核心语法、面向对象编程和JVM内存管理是掌握这门语言的基础。通过实战项目如天气查询系统的开发,可以快速应用集合框架、多线程并发等关键技术。针对新手常见误区,如字符串拼接性能问题和异常处理原则,提供了优化方案。从环境配置到现代Java特性,本指南覆盖了Java开发全流程的关键知识点,帮助开发者在30小时内建立完整的知识体系。

weixin_30727835的博客 498

MATLAB 基于 Baker 映射和 Logistic 混沌序列的图像加解密实现

图像加密是信息安全领域的重要研究方向,在数字版权保护、隐私保护等领域有着广泛应用。本文将介绍基于 MATLAB 的 Baker 映射和 Logistic 混沌序列的图像加解密算法,该算法利用混沌系统的初值敏感性和伪随机性,能够有效地对图像进行加密和解密。基于 Baker 映射和 Logistic 混沌序列的图像加解密算法是一种有效的方法,可以应用于数字版权保护、隐私保护等领域。MATLAB 提供了强大的工具和函数,可以方便地实现该算法。

走向CTO的路上... 933

OpenWRT使用4G/5G无线网卡模块上网

将4G/5G开发板插入设备,终端输入lsusb或lspci,看设备是否识别到4G/5G模块。

1万+

Java:111-SpringMVC的底层原理(中篇)

如果需要补充,自行补充吧 对应的web.xml: index.jsp: springmvc.xml: entity里面的User类: test类: 自行配置tomcat,启动,运行看看结果,那么我们基础操作搭建完毕,现在我们来操作一下拦截: 在com包下创建Interceptor包,然后创建MyInterceptor类: 其中HandlerInterceptor接口如下: 这三个代表了三个地方,前面的三个拦截,比如: preHandle是第一个拦截,postHandle是第二个拦截,after

qq_59609098的博客 1304

基于STM32XX的LCD液晶显示屏(HS19264G06A、驱动芯片:ST7525)驱动C程序设计

define USE_HW_SPI 1 // 1:使用硬件SPI, 0:使用软件模拟SPI。

myron6688的博客 234

数据转换实战:从手动映射到框架应用,构建高效优雅的代码架构

数据转换是软件开发中连接不同数据格式与结构的关键技术,其核心原理在于将数据从一种表示形式转换为另一种,以满足不同消费方的需求。这一过程不仅涉及简单的字段映射,更关乎系统架构的清晰度与可维护性。在工程实践中,引入独立的数据转换层能有效分离业务逻辑与接口细节,遵循单一职责原则,从而提升代码复用性并降低维护成本。无论是处理API响应格式化、报表生成,还是构建配置转换中间件,合理的数据转换策略都至关重要。本文以用户信息转换为例,深入探讨了从基础手动映射到使用MapStruct、class-transformer等高

culuo8053的博客 346

锁的艺术:Java并发中的常用锁策略与实践

对java锁相关内容进行整理分析:乐观锁 VS 悲观锁+自旋锁 VS 适应性自旋锁+无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁+公平锁 VS 非公平锁+可重入锁 VS 非可重入锁+独享锁 VS 共享锁

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 171万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 使用Spring中Transcation进行数据库集成测试
下一篇: IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题
kiwi小白
博客等级 码龄14年 153粉丝 154原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值