最新要闻
- 【环球速看料】柞水终南山寨一日游攻略(终南山寨在什么地方)
- 不靠氪金 价格卷死同行:逆水寒手游开启二测多次冲上热搜:预约超3000万
- 好友田启文爆料周星驰或将于65岁重返大银幕!自导自演、阵容空前-短讯
- 抗衡奔驰E级 全新宝马5系无伪谍照首曝:大鸡腿档杆成历史
- 比马斯克的猎鹰还强10倍?俄罗斯自研火箭将可重复使用100次 天天热点
- 蔚来起诉抖音大V造谣侵权:索赔200万
- 环球观点:中科氢量平通仪好不好(中科氢量平通仪)
- 当AI遇上AD,腾讯信息流广告行业的智能化营销前景如何?-世界通讯
- 环球观速讯丨“3nm EUV”工艺稳了 Intel明年上半年出货144核至强处理器:超越Zen4
- 明天五一!滴滴副总裁李敏:今晚高峰打车不容易 成功率可能不足50%|全球新动态
- 成都一民宿推出“36元睡客厅躺椅”服务:已被预订一空
- 环球百事通!100%纯棉!雅鹿男士背心2件只要29元
- 1L体积塞进电源!联想小新mini主机开启预售:3699元起
- 轻松脱眉毛下垂的方法是什么
- 当前播报:generate什么意思_generate是什么意思呢
- 全球关注:特斯拉:不要相信马斯克对自动驾驶的宣传、可能是假的
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
用 ChatGPT 写代码,效率杠杠的! 实时
来源:https://www.cnblogs.com/scy251147/p/17242557.html
ChatGPT出来好久了,vscode上面由于集成了相关的插件,所以用起来很简单,经过本人深度使用后,发觉其能力的强大之处,在书写单元测试,书写可视化小工具,代码纠错,代码规范,编程辅助方面,极其可靠,而且能识别一些坑并绕过,下面来看看他能干的一些事情吧。
(资料图片)
注意:由于英文的表述可以让ChatGPT的反馈更准确,所以这里的问题我均以英文来描述。
1、单测用例生成
待生成单测的测试类,此类就是一个静态工厂类,可以根据传入的数据类型和语言类型,创建出几个语言数据服务,包括ducc,mysql,配置,空语言数据服务:
public class SepI18nDataFactory { /** * 配置文件数据服务 */ public static ISepI18nDataService dataService; /** * 构建数据服务 * * @param dataType * @return */ public static ISepI18nDataService buildDataService(SepI18nDataType dataType, SepI18nLanguageType languageType) { //按照数据类型判断 switch (dataType) { //从ducc中构建多语言服务 case DUCC: return getInstance(languageType, x -> new SepI18nDuccDataService(x)); //从mysql中构建多语言服务 case MYSQL: return getInstance(languageType, x -> new SepI18nMysqlDataService(x)); //从本地配置中构建多语言服务 case CONFIG: return getInstance(languageType, x -> new SepI18nConfigDataService(x)); //空数据服务,兜底逻辑 default: return getInstance(languageType, x -> new SepI18nEmptyDataService(x)); } } /** * 高并发下实例创建管控 * * @param languageType * @param callback * @return */ private static ISepI18nDataService getInstance(SepI18nLanguageType languageType, Function callback) { if (dataService == null) { synchronized (SepI18nDataFactory.class) { if (dataService == null) { dataService = callback.apply(languageType); } } } return dataService; }}
ChatGPT问题如下(要求:为类中的所有方法创建单测并包含所有的场景):
program unit tests for all methods for below class , you need test all scenarios, show me the code by using java language:public class SepI18nDataFactory {/** * 配置文件数据服务 */public static SepI18nConfigDataService configDataService;/** * 数据库数据服务 */public static SepI18nMysqlDataService mysqlDataService;/** * ducc数据服务 */public static SepI18nDuccDataService duccDataService;/** * 空数据服务 - 兜底服务 */public static SepI18nEmptyDataService emptyDataService;/** * 构建数据服务 * @param dataType * @return */ public static ISepI18nDataService buildDataService(SepI18nDataType dataType, SepI18nLanguageType languageType) { //区域设定 Locale locale = null; //按照数据类型判断 switch (dataType) { //从ducc中构建多语言服务 case DUCC: if (duccDataService == null) { duccDataService = new SepI18nDuccDataService(languageType); } return duccDataService; //从mysql中构建多语言服务 case MYSQL: if (mysqlDataService == null) { mysqlDataService = new SepI18nMysqlDataService(languageType); } return mysqlDataService; //从本地配置中构建多语言服务 case CONFIG: if (configDataService == null) { configDataService = new SepI18nConfigDataService(languageType); } return configDataService; //空数据服务,兜底逻辑 default: if (emptyDataService == null) { emptyDataService = new SepI18nEmptyDataService(languageType); } return emptyDataService; } }}
ChatGPT回答如下:
import static org.junit.Assert.assertEquals; import org.junit.Test;public class SepI18nDataFactoryTest { @Test public void testBuildDataService_DUCC() { SepI18nDataType dataType = SepI18nDataType.DUCC; SepI18nLanguageType languageType = SepI18nLanguageType.EN; ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType); assertEquals(SepI18nDuccDataService.class, dataService.getClass()); } @Test public void testBuildDataService_MYSQL() { SepI18nDataType dataType = SepI18nDataType.MYSQL; SepI18nLanguageType languageType = SepI18nLanguageType.EN; ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType); assertEquals(SepI18nMysqlDataService.class, dataService.getClass()); } @Test public void testBuildDataService_CONFIG() { SepI18nDataType dataType = SepI18nDataType.CONFIG; SepI18nLanguageType languageType = SepI18nLanguageType.EN; ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType); assertEquals(SepI18nConfigDataService.class, dataService.getClass()); } @Test public void testBuildDataService_Default() { SepI18nDataType dataType = SepI18nDataType.OTHER; SepI18nLanguageType languageType = SepI18nLanguageType.EN; ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType); assertEquals(SepI18nEmptyDataService.class, dataService.getClass());}}
生成的单测可以完美运行且包含所有的场景,完美。
2、编写小工具
由于在工作中,我们免不了需要写一些小工具来辅助业务,所以看看是否可以把这种活儿交给ChatGPT来干一下。 这里我们准备让其编写基于javafx框架的form界面工具,然后实际运行这个小工具来检验其编写小工具的可行性。
ChatGPT问题如下(界面上,两个文本框,两个按钮,点击第一个按钮,会选择文件夹,然后点击第二个按钮会将文件夹下的enum类名显示到另一个文本框中):
a form with two textfields, two buttons, click one button to locate the directory path and fill it into a textfield, and click another button to start to find the enum .class file from the directory path and show the enum class name into textfield, using javafx structure and show me the java code
ChatGPT回答如下:
import javafx.application.Application;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.control.TextField;import javafx.scene.layout.HBox;import javafx.stage.DirectoryChooser;import javafx.stage.Stage;import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.util.stream.Stream;public class EnumFinder extends Application {private TextField directoryPathTextField;private TextField enumClassNameTextField;public static void main(String[] args) { launch(args);}@Overridepublic void start(Stage primaryStage) { directoryPathTextField = new TextField(); Button directoryPathButton = new Button("Select Directory"); directoryPathButton.setOnAction(e -> { DirectoryChooser directoryChooser = new DirectoryChooser(); File selectedDirectory = directoryChooser.showDialog(primaryStage); if (selectedDirectory != null) { directoryPathTextField.setText(selectedDirectory.getAbsolutePath()); } }); Button findEnumButton = new Button("Find Enum"); findEnumButton.setOnAction(e -> { String directoryPath = directoryPathTextField.getText(); try (Stream paths =Files.walk(Paths.get(directoryPath))){ paths.filter(Files::isRegularFile).filter(p -> p.toString().endsWith(".class")).filter(p ->isEnumClass(p)).forEach(p -> enumClassNameTextField.setText(p.getFileName().toString().replace(".class","")));}catch(IOException ex){ ex.printStackTrace();}}); enumClassNameTextField =newTextField(); enumClassNameTextField.setEditable(false);HBox hBox =newHBox(directoryPathTextField, directoryPathButton, findEnumButton, enumClassNameTextField);Scene scene =newScene(hBox); primaryStage.setScene(scene); primaryStage.show();}privatebooleanisEnumClass(Path path){try{Class clazz =Class.forName(path.toString().replace(".class",""));return clazz.isEnum();}catch(ClassNotFoundException e){ e.printStackTrace();returnfalse;}}}
有点呆住了,居然完全正确的生成了我要的工具且能正常运行(稍微调整下界面布局)。
3. 修复代码bug
Sample1:高并发bug
还是之前的代码,改了改,让其在高并发压力下,工作的不那么ok:
public class SepI18nDataFactory { /** * 配置文件数据服务 */ public static ISepI18nDataService dataService; /** * 构建数据服务 * * @param dataType * @return */ public static ISepI18nDataService buildDataService(SepI18nDataType dataType, SepI18nLanguageType languageType) { //按照数据类型判断 switch (dataType) { //从ducc中构建多语言服务 case DUCC: return getInstance(languageType, x -> new SepI18nDuccDataService(x)); //从mysql中构建多语言服务 case MYSQL: return getInstance(languageType, x -> new SepI18nMysqlDataService(x)); //从本地配置中构建多语言服务 case CONFIG: return getInstance(languageType, x -> new SepI18nConfigDataService(x)); //空数据服务,兜底逻辑 default: return getInstance(languageType, x -> new SepI18nEmptyDataService(x)); } } /** * 高并发下实例创建管控 * * @param languageType * @param callback * @return */ private static ISepI18nDataService getInstance(SepI18nLanguageType languageType, Function callback) { if (dataService == null) { dataService = callback.apply(languageType); } return dataService; }}
ChatGPT训练如下(指出代码在高并发下工作不太正常,让其修复):
below class is worked not ok under high flow pressure, please find the bug and fix for me :public class SepI18nDataFactory {/** 配置文件数据服务 */public static ISepI18nDataService dataService;/** 构建数据服务* @param dataType* @return*/public static ISepI18nDataService buildDataService(SepI18nDataType dataType, SepI18nLanguageType languageType) {//按照数据类型判断switch (dataType) {//从ducc中构建多语言服务 case DUCC: return getInstance(languageType, x -> new SepI18nDuccDataService(x));//从mysql中构建多语言服务 case MYSQL: return getInstance(languageType, x -> new SepI18nMysqlDataService(x));//从本地配置中构建多语言服务 case CONFIG: return getInstance(languageType, x -> new SepI18nConfigDataService(x));//空数据服务,兜底逻辑 default: return getInstance(languageType, x -> new SepI18nEmptyDataService(x));}} /** 高并发下实例创建管控 * @param languageType * @param callback * @return */ private static ISepI18nDataService getInstance(SepI18nLanguageType languageType, Function callback) { if (dataService == null) { synchronized (SepI18nDataFactory.class) { if (dataService == null) { dataService = callback.apply(languageType); } } } return dataService; }}
ChatGPT回答如下:
It looks like the bug is in the getInstance() method. The dataService variable is not being synchronized, which can cause issues with concurrent access. To fix this, you can add a synchronized block around the code that checks and sets the dataService variable. This will ensure that only one thread can access the variable at a time.
很明显,一针见血的指出了高并发下存在的问题。
Sample2: 自定义锁bug
随便写了个基于AQS锁框架的自定义锁,代码如下:
class SepSync extends AbstractQueuedSynchronizer { @Override protected boolean tryAcquire(int arg) { if (compareAndSetState(0, 1)) { setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } @Override protected boolean tryRelease(int arg) { if (getState() == 0) { throw new IllegalMonitorStateException(); } setExclusiveOwnerThread(null); setState(0); return true; } public void lock() { acquire(1); } public void unlock() { release(1); }}
ChatGPT问题如下(大意是帮忙看下锁写的有没有问题):
below is the lock class, please find the bug and fix it for me :class SepSync extends AbstractQueuedSynchronizer {@Override protected boolean tryAcquire(int arg) {if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}@Overrideprotected boolean tryRelease(int arg) {if (getState() == 0) {throw new IllegalMonitorStateException();}setExclusiveOwnerThread(null);setState(0);return true;}public void lock() {acquire(1);}public void unlock() {release(1);}}
ChatGPT回答如下:
The bug in the above code is that the tryRelease() method does not check if the current thread is the exclusive owner thread before releasing the lock. This can lead to a situation where the lock is released by a thread that does not own it.To fix this bug, the tryRelease() method should be modified to check if the current thread is the exclusive owner thread before releasing the lock. The modified code should look like this:@Override protected boolean tryRelease(int arg){if(Thread.currentThread() != getExclusiveOwnerThread()){throw new IllegalMonitorStateException();}setExclusiveOwnerThread(null);setState(0);return true;}
大意就是,我的锁写的有点问题,其他线程可以释放不属于它的锁。(幸好偷偷去看了ReetrentLock实现,确实如此),到这里有些折服了。
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
关键词:
-
用 ChatGPT 写代码,效率杠杠的! 实时
来源:https: www cnblogs com scy251147 p 17242557 htmlChatGPT出来好久了,vscode上面由于集成了相关的
来源: 用 ChatGPT 写代码,效率杠杠的! 实时
一文看懂低代码,5分钟从入门到原理全搞定 环球热文
论并行,并发,同步,异步之间的联系与区别-天天实时
【环球速看料】柞水终南山寨一日游攻略(终南山寨在什么地方)
中信建投国家电投新能源REIT获原始权益人增持3200万份
天天快资讯丨【财经分析】IPv6如何从“能用”转向“好用”“爱用”?
不靠氪金 价格卷死同行:逆水寒手游开启二测多次冲上热搜:预约超3000万
好友田启文爆料周星驰或将于65岁重返大银幕!自导自演、阵容空前-短讯
抗衡奔驰E级 全新宝马5系无伪谍照首曝:大鸡腿档杆成历史
比马斯克的猎鹰还强10倍?俄罗斯自研火箭将可重复使用100次 天天热点
蔚来起诉抖音大V造谣侵权:索赔200万
环球观点:中科氢量平通仪好不好(中科氢量平通仪)
python的绘图工具matplotlib.pyplot-环球报资讯
App Store上架流程/苹果app发布流程 全球快播
当AI遇上AD,腾讯信息流广告行业的智能化营销前景如何?-世界通讯
环球观速讯丨“3nm EUV”工艺稳了 Intel明年上半年出货144核至强处理器:超越Zen4
明天五一!滴滴副总裁李敏:今晚高峰打车不容易 成功率可能不足50%|全球新动态
成都一民宿推出“36元睡客厅躺椅”服务:已被预订一空
环球百事通!100%纯棉!雅鹿男士背心2件只要29元
1L体积塞进电源!联想小新mini主机开启预售:3699元起
轻松脱眉毛下垂的方法是什么
二分查找算法讲解及其C++代码实现 天天聚看点
世界今日报丨相亲成功率100%!技术大佬都在用的SWOT模型【No.3】
当前播报:generate什么意思_generate是什么意思呢
全球关注:特斯拉:不要相信马斯克对自动驾驶的宣传、可能是假的
5月26上映!《小美人鱼》女主全球爆火 黑小美人鱼晒新海报原来这么美? 最新消息
锦州师范学院地址在哪里 锦州师范学院
这两个重载方法,你怎么重构?
民航今天预计发送旅客208万人次
ChatGPT成必备技能!超九成企业想雇佣了解ChatGPT的员工
【全球播资讯】性能提升36%!Surface Laptop 5评测:Windows阵营最精致优雅的轻薄本
搭载全新12代i3八核处理器轻薄本仅2999元!攀升笔记本超级秒杀
手机摆动跳广告判了!大学生起诉美图秀秀获赔1元
视点!国外车主吐槽新特斯拉Model S做工差:对不起这价格
每日快播:华为P60可支持5G了 只要640元
视焦点讯!博弈论入门
定了!“五一”期间,这些行为不予处罚|今日讯
首发6nm天玑8020芯片!荣耀平板V8发布:1799元起
日本东电坚持福岛核污染水排海计划不变:总量约133万吨|全球热资讯
当前看点!40年Microsoft品牌再见!Suface全面接棒微软配件市场
各个大长腿超短裙吸睛:淄博一群175美少女接送游客非官方行为 天天热点评
热门看点:首款百万售价比亚迪!仰望U8动力信息曝光:纯电180km、零百最快3.6s
亚洲有多少个国家?亚洲最好的大学是哪个?亚洲哪个国家最干净?
全球新资讯:无锡口腔医院价格表
进击的巨人真相是什么?进击的巨人最终季大结局
武林外传为什么那么火?武林外传为什么不拍第二部?
为什么这么多人喜欢海绵宝宝?为什么海绵宝宝里的章鱼哥总是不开心?
猫咪为什么不喜欢橘子味?橘猫为什么体型那么大?
qq炫舞炫彩宝石怎么获得?qq炫舞炫彩宝石有什么用?
IM开发干货分享:IM客户端不同版本兼容运行的技术思路和实践总结
简单渗透测试流程-环球观速讯
天天快资讯:AIRIOT助力城市管廊工程,智慧物联守护城市生命线
全球速讯:[Termux]更换Termux源 安装Debian容器并 设置Debian镜像源且 安装code-server(附安卓/APK安装包+下载源+lan
笔记本gt630m相当于什么核显?笔记本GT630M显卡怎么样?
梦幻西游2需要点卡吗?梦幻西游2023新区开服表
IBMThinkPad笔记本电脑怎么一键还原?IBMThinkPad笔记本电脑怎么开机?
岳阳楼下诵经典|全球今日讯
大连市长城宽带DNS是多少?大连市长城宽带资费表
当前观察:硬盘预读参数变化分析
继烧烤后淄博代购也火了:网友都很想去
“五一”假期高速免费五天!提前出发的过省界收费站时注意时间 环球快播报
今日讯!五一这些景点门票已约满:游客注意别跑空
3200RPM超高转速 满速运转还不抖!酷冷至尊莫比乌斯120 OC风扇评测 环球报资讯
科幻工业风!红魔电竞显示器银翼版来了:极窄边框设计 热点评
贵阳市档案馆通过全国示范数字档案馆测试
Linux恢复文件双手锏|全球即时
世界热讯:基于Java开发的数字知识库,支持全文检索、知识图谱和工作流审批,太强大了
微资讯!聊一聊GIS之家团队数据案例源码共享以及在线体验
当前热讯:JasperReports教程_编程入门自学教程_菜鸟教程-免费教程分享
安装Amos结构方程模型分析软件的方法 环球热闻
兴齐眼药去年四季度起利润急降:“近视神药”网售被禁影响显现,正式上市时市场恐已成红海
7项技术行业唯一!vivo X Fold2今日首销:8999元起
五一档票房第一!王一博电影《长空之王》今日上映:歼-20真机硬核亮相_世界热头条
热议:四川瓦屋山首次发现猛禽之王:自然界顶级掠食者 海拔4000米以上活动
60架C919和40架ARJ21!海航豪购100架国产飞机 环球微头条
小鹏G6创意视频被指“侮辱科学家” 创作者发声:绝非侮辱而是致敬
证监会:下月公布虚拟交易平台发牌框架
每日聚焦:Docker获取Let`s Encrypt SSL 证书
天天热讯:【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
一季度新接船舶订单量同比增53%(新数据 新看点) 环球看热讯
Win10再见!微软确认22H2为终极正式版 系统不再更新:2025年结束支持
价保618!真我GT Neo5降了:1TB版卖3299元 世界快报
比Wi-Fi 6快4倍!华为首测Wi-Fi 7:真机网速狂飙4.3Gbps 当前热门
全球快看:越来越黑化!《变形金刚1-7》女主角颜值变化 网友叹息黑人赢麻了
天风证券:4月第3周新能源汽车订单明显改善,车展有望带动终端需求回升
“欧佩克+”减产倒计时 中国能源供给如何摆脱新变数|环球今亮点
天天热文:北大校训是什么(北京大学的校训是什么)
新一轮国内油价今日调整 有望下调0.11元/升!中石油:油价过低不好 世界关注
世界热头条丨同事结婚行政到工位挨个收礼金被吐槽 还不请吃饭:网友热议别强迫
世界快看点丨史诗级升级!曝iPhone 15 Pro支持雷电3
世界热议:学系统集成项目管理工程师(中项)系列13b_人力资源管理(下)
当前速递!文移民合同范本(推荐4篇)
分享无人回应 爸爸退了家庭群:媒体点评称这是最起码尊重_每日信息
pandas 常见函数的使用 环球速讯
全球微动态丨[MoeCTF 2021]地狱通讯
《飞链云真实AI模特解决方案》
超越美国 我国核电机组2030年将达世界第一:第四代核电已有探索
内地引进!《变形金刚7:超能勇士崛起》正式预告发布:宇宙大帝来袭 焦点简讯
世界关注:国外品牌光环不再 你敢信车展排队半小时是为了看国产车?
7nm不让用!飞腾腾云5000C CPU公布:80核心变64核心 性能大大缩水_天天速递