完蛋!ChatGPT 完全取代了我的 Java 编程工作!

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

点击关注#互联网架构师公众号,领取架构师全套资料 都在这里6a6ef7d1464177c2c3b2d8f016ec50ff.png

0、2T架构师学习资料干货分

上一篇:ChatGPT研究框架(80页PPT,附下载)

大家好,我是互联网架构师!

ChatGPT 完全取代了我的 Java 编程工作!

ChatGPT出来好久了,vscode、idea 上面由于集成了相关的插件,所以用起来很简单,经过本人深度使用后,发觉其能力的强大之处,在书写单元测试,书写可视化小工具,代码纠错,代码规范,编程辅助方面,极其可靠,而且能识别一些坑并绕过,下面来看看他能干的一些事情吧。

注意:由于英文的表述可以让 ChatGPT 的反馈更准确,所以这里的问题我均以英文来描述

单测用例生成

待生成单测的测试类,此类就是一个静态工厂类,可以根据传入的数据类型和语言类型,创建出几个语言数据服务,包括 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<SepI18nLanguageType, ISepI18nDataService> callback) {if (dataService == null) {synchronized (SepI18nDataFactory.class) {if (dataService == null) {dataService = callback.apply(languageType);}}}return dataService;}
}

注意上面有并发 bug,具体参考《美团面试题:DCL单例模式需不需要volatile?》。

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()); }@Testpublic void testBuildDataService_MYSQL() {SepI18nDataType dataType = SepI18nDataType.MYSQL;SepI18nLanguageType languageType = SepI18nLanguageType.EN;ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType);assertEquals(SepI18nMysqlDataService.class, dataService.getClass());}@Testpublic void testBuildDataService_CONFIG() {SepI18nDataType dataType = SepI18nDataType.CONFIG;SepI18nLanguageType languageType = SepI18nLanguageType.EN;ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType);assertEquals(SepI18nConfigDataService.class, dataService.getClass());}@Testpublic void testBuildDataService_Default() {SepI18nDataType dataType = SepI18nDataType.OTHER;SepI18nLanguageType languageType = SepI18nLanguageType.EN;ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType);assertEquals(SepI18nEmptyDataService.class, dataService.getClass());}}

生成的单测可以完美运行且包含所有的场景,完美。

a753eec06a9df7ba01cdf81092559605.png

ChatGPT编写单元测试

编写小工具

由于在工作中,我们免不了需要写一些小工具来辅助业务,所以看看是否可以把这种活儿交给 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);
}@Override
public 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<Path> 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;}}}

有点呆住了,居然完全正确的生成了我要的工具且能正常运行(稍微调整下界面布局)。

527a3b681624e58c86a0129dfb0f0f0a.jpeg
ChatGPT编写小工具

修复代码bug

案例一:高并发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<SepI18nLanguageType, ISepI18nDataService> 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.

很明显,一针见血的指出了高并发下存在的问题。

自定义锁bug

随便写了个基于 AQS 锁框架的自定义锁,代码如下:

class SepSync extends AbstractQueuedSynchronizer {@Overrideprotected 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问题如下(大意是帮忙看下锁写的有没有问题):

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; } @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回答如下:

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 的实现,确实如此),到这里有些折服了。

44cfdd8d3432ce9cdf49d66e7b0b58e7.jpeg
ChatGpt修改bug

当然这里可以让 ChatGPT 帮忙改进和修复问题。细节我就不再贴了。ChatGPT 现在还是 4.0 的版本,可以相信,它再进化几个版本后的,能力该有多强?

如果你的问题问的好,ChatGPT 几乎可以取代我的大部分编码工作!

来源:cnblogs.com/scy251147/p/17242557.html

1、Alibaba开源内网高并发编程手册.pdf

2、2T架构师学习资料干货分享

3、10000+TB 资源,阿里云盘,牛逼!!

4、基本涵盖了Spring所有核心知识点总结

  · END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

470afd3e2b062b68927f8c25bcfe8180.png

如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描上方二维码关注一下,您的支持是我坚持写作最大的动力。

求一键三连点赞、转发、在看。

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

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

相关文章

ChatGPT思考:探索智能的极限

作者&#xff1a;符尧 yao.fued.ac.uk University of Edinburgh & Allen Institute for AI 海外独角兽和拾象一直抱着开源研究&#xff0c;开放分享的心态&#xff0c;本文是拾象 Fellow 符尧关于 ChatGPT 的新思考。符尧曾写过一篇非常精彩的拆解GPT3起源的文章&#xf…

ChatGPT 给我们 带来的哲学思考

ChatGPT 给我们 带来的哲学思考 ChatGPT 是一种基于 GPT-3 模型的聊天机器人&#xff0c;它可以与人类进行自然、流畅、有趣的对话。ChatGPT 的出现&#xff0c;不仅是人工智能技术的一次重大突破&#xff0c;也是对人类社会和文化的一次挑战。ChatGPT 给我们带来了一些哲学上…

Netflix 总用户达到 2.325 亿;马斯克打脸创建 X.AI 公司;印度首开苹果门店;谷歌老板对 AI 很担心?特斯拉营收增加,但净利润下降…《经济学人 | 第 17 期 | 速读版》

快速阅读版&#xff0c;完整英文解析版见&#xff1a; https://blog.csdn.net/YopenLang/article/details/130375444 中国第一季度经济增长出乎意料 中国第一季度经济同比增长 4.5%&#xff0c;超出了大多数经济学家的预期。 China’s economy grew by 4.5% in the first quart…

大火的 ChatGPT,让中国式教育面临巨大挑战?

大火的 ChatGPT&#xff0c;让中国式教育面临巨大挑战&#xff0c;ChatGPT是目前最先进的人工智能聊天机器人。它有多牛呢&#xff1f; 特斯拉的老板马斯克赞美它&#xff1a;“好得吓人。 苹果的老板库克赞美它&#xff1a;“不可思议。 微软的老板比尔盖茨赞美它&…

chatgpt赋能python:Python如何进行分步运行

Python如何进行分步运行 Python是一种强大的编程语言&#xff0c;可以用于开发各种应用程序和Web应用程序。在Python中&#xff0c;您可以使用一些简单的技术来分步运行程序&#xff0c;这将使您更容易调试程序并更好地理解程序的工作原理。在本文中&#xff0c;我们将介绍如何…

chatgpt赋能python:利用Python编写模拟器:一种循序渐进的方法

利用Python编写模拟器&#xff1a;一种循序渐进的方法 模拟器是一种用于模拟计算机硬件或软件的程序。它模拟了真实设备的功能&#xff0c;可以帮助开发人员进行测试和调试&#xff0c;以及提供一种环境来设计和验证新的算法和协议。Python是一种广泛使用的编程语言&#xff0…

chatgpt赋能python:Python如何打断点——提高调试效率

Python如何打断点——提高调试效率 Python是一种易于学习、易于编写和易于调试的高级编程语言。调试是编程过程中必不可少的步骤&#xff0c;打断点是其中一个最常用的工具。打断点可以让程序在指定行停止执行&#xff0c;以便程序员可以检查代码和变量值&#xff0c;以及测试…

chatgpt赋能python:Python快捷键设置介绍

Python快捷键设置介绍 Python是一种高级编程语言&#xff0c;也是众多程序员和开发者广泛采用的语言之一。虽然Python作为一种易学易用的语言&#xff0c;但学习Python仍然需要一定的时间和耐心。其中Python快捷键设置可以让编程变得更加快速和高效。 Python快捷键设置能够更…

chatgpt赋能python:Python调试技巧:如何使用断点运行程序

Python调试技巧&#xff1a;如何使用断点运行程序 在Python编程中&#xff0c;程序出现错误或需要调试时&#xff0c;我们需要一些工具来帮助我们定位问题和修复代码。其中之一就是使用断点来运行程序。接下来我们将讨论如何在Python中使用断点进行程序调试的相关技巧。 什么…

chatgpt赋能Python-python_chariot

Python Chariot&#xff1a;一款强大的Python IDE Python Chariot是一款强大的Python IDE&#xff0c;它的特点是简单易用&#xff0c;功能齐全。该IDE适用于各种Python编程任务&#xff0c;无论是编写小型脚本还是大型项目。在本文中&#xff0c;我们将深入介绍Python Chario…

ChatGPT、Java 8 文档、MySQL都说 JDBC 没必要 `Class.forName()`,结果报错了……

文章目录 回顾 Tomcat 部署 WAR 应用报错找不到数据库驱动的问题ChatGPT、Javadoc 和 MySQL 驱动都说没必要 Class.forName()实验创建一个最小复现问题的 Demo不调用 Class.forName("com.mysql.cj.jdbc.Driver")调用 Class.forName("com.mysql.cj.jdbc.Driver&q…

chatgpt赋能Python-pythonctrl快捷键

PythonCtrl快捷键使用指南 作为一名有10年Python编程经验的工程师&#xff0c;我深知PythonCtrl快捷键的重要性。PythonCtrl作为一个Python的开源编辑器&#xff0c;在每一个版本中都加入了更多的功能和快捷键&#xff0c;使得Python编程更加高效和易用。在本篇文章中&#xf…

chatgpt赋能python:Python如何查错

Python如何查错 Python是一种高级编程语言&#xff0c;由于其良好的可读性和易于学习的特性&#xff0c;成为了众多开发人员的首选。但是&#xff0c;编写Python程序时难免会遇到错误&#xff0c;为了节省时间和提高效率&#xff0c;本文将介绍如何使用Python查错。 1. 抛出异…

chatgpt赋能python:Python程序改错

Python程序改错 Python是一种面向对象的动态编程语言&#xff0c;拥有近20年的发展历程&#xff0c;并逐渐成为全球范围内最受欢迎的编程语言之一。与其它编程语言相同&#xff0c;Python程序也会出现错误&#xff0c;有时候这些错误很难找到和解决。为了帮助有需要的读者&…

chatgpt赋能python:Python如何使用断点进行调试

Python 如何使用断点进行调试 Python是一种易于学习和读写的编程语言&#xff0c;但是在编写代码的过程中&#xff0c;难免会遇到某些代码无法正常运行或者出现错误。这时候&#xff0c;我们就需要使用调试工具来找出问题所在&#xff0c;而打断点是一种方便的调试方法。 什么…

chatgpt赋能python:Python断点调试指南:让调试更高效

Python断点调试指南&#xff1a;让调试更高效 在Python编程中&#xff0c;调试是一个必不可少的环节。当我们面临代码出现错误或程序不按预期运行时&#xff0c;如何快速找到问题&#xff0c;解决它们呢&#xff1f;这时候断点调试就发挥了重要的作用。本篇文章主要介绍Python…

chatgpt赋能python:介绍Python断点:提高代码调试的效率

介绍Python断点&#xff1a;提高代码调试的效率 Python作为一种高级编程语言&#xff0c;在编写代码过程中&#xff0c;难免会出现各种错误和bug。为了更加高效地调试代码&#xff0c;Python提供了断点&#xff08;breakpoint&#xff09;功能&#xff0c;让开发者能够在代码某…

LlamaIndex的使用 | LangChain的研究 | pdfgpt安装使用

LlamaIndex在https://github.com/jerryjliu/llama_index 文档在https://gpt-index.readthedocs.io/en/latest/guides/primer/usage_pattern.html 第一个坑&#xff0c;python3.7安装不了库 后来使用的是python3.8.7关于LlamaIndex读取的原理 在python版的pdfchat中&#xff…

chatgpt赋能python:Python如何进行断点运行

Python 如何进行断点运行 什么是断点运行 在Python中&#xff0c;断点运行是一种非常有用的调试技术。当代码运行时&#xff0c;程序会在代码中设置的断点处暂停&#xff0c;以便开发者可以检查代码的状态和行为。这种方法可以大大减少调试代码所需的时间和精力。 如何设置断…

chatgpt赋能python:Python取消断点的方法

Python取消断点的方法 在Python开发过程中&#xff0c;我们经常需要设置断点来帮助我们调试代码。但是&#xff0c;有时候我们可能需要取消已设置的断点。本文将介绍如何取消Python中的断点。 1. 什么是断点 在Python中&#xff0c;断点是为了帮助调试代码而设置的一个标志。…