ChatGpt для Java программистов.
В этом посте я приведу пример, как можно использовать нейросеть ChatGpt для помощи в работе при написании Java кода. Я привел свои запросы и ответы с кодом от ChatGPt, оцените качество кода, который пишет бот.
@chatgpt – chatgpt ведет телеграм.
Работаем с ChatGpt для написания Java кода.
ChatGpt для Java программистов это не панацея, которая избавит вас от написания кода, это просто помощник, который может помочь быстро написать простые скрипты.
Мой диалог с ChatGpt для создания скриптов на Java:
Я: “напиши java-программу, которая запишет 220000000000 случайных байт в файл”.
Бот:
Вывод:
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class WriteRandomBytes {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("random_bytes.bin");
Random random = new Random();
int numBytes = 220000000000;
for (int i = 0; i < numBytes; i++) {
fos.write(random.nextInt(256));
}
fos.close();
} catch (IOException e) {
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
}
Не самый эффективный код и ChatGpt не использует try-with-resources, но вполне пригодный скрипт для этой задачи. ChatGpt также не заметил, что число вышло за пределы диапазона для int.
Я: можешь ли ты переписать код, чтобы он использовал try-with-resources
Бот: Конечно, вот обновленный код, в котором используется оператор try-with-resources:
Вывод:
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class WriteRandomBytes {
public static void main(String[] args) {
long numBytes = 220000000000L;
try (FileOutputStream fos = new FileOutputStream("random_bytes.bin")) {
Random random = new Random();
for (long i = 0; i < numBytes; i++) {
fos.write(random.nextInt(256));
}
} catch (IOException e) {
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
}
Я: добавь BufferedOutputStream, чтобы сделать код более эффективным
Бот: Вот обновленный код, который использует BufferedOutputStream для повышения производительности:
Вывод:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class WriteRandomBytes {
public static void main(String[] args) {
long numBytes = 220000000000L;
try (BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("random_bytes.bin"))) {
Random random = new Random();
for (long i = 0; i < numBytes; i++) {
bos.write(random.nextInt(256));
}
} catch (IOException e) {
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
}
Класс BufferedOutputStream предоставляет буфер, который помогает уменьшить количество низкоуровневых операций записи, выполняемых на базовом FileOutputStream. Это может привести к повышению производительности за счет уменьшения количества операций ввода-вывода на диск.
Что произойдет, если попросить ChatGpt использовать отступы Allman?
Ответ ChatGpt:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class WriteRandomBytes
{
public static void main(String[] args)
{
long numBytes = 220000000000L;
try (BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("random_bytes.bin")))
{
Random random = new Random();
for (long i = 0; i < numBytes; i++)
{
bos.write(random.nextInt(256));
}
}
catch (IOException e)
{
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
}
Я: сделать “random” статическим членом класса
Бот:
Чтобы сделать экземпляр Random статическим конечным членом класса, вы можете объявить его как приватное статическое поле в классе WriteRandomBytes. Вот измененный код:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class WriteRandomBytes {
private static final Random RANDOM = new Random();
public static void main(String[] args) {
long numBytes = 220000000000L;
try (BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("random_bytes.bin"))) {
for (long i = 0; i < numBytes; i++) {
bos.write(RANDOM.nextInt(256));
}
} catch (IOException e) {
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
}
Я: ChatGpt, используй константу для хранения имени файла
Бот:
Чтобы использовать константу для хранения имени файла, вы можете объявить private static final string в классе WriteRandomBytes и инициализировать его именем файла. Вот измененный код:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class WriteRandomBytes {
private static final Random RANDOM = new Random();
private static final String FILE_NAME = "random_bytes.bin";
public static void main(String[] args) {
long numBytes = 220000000000L;
try (BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(FILE_NAME))) {
for (long i = 0; i < numBytes; i++) {
bos.write(RANDOM.nextInt(256));
}
} catch (IOException e) {
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
}
Я: сделай “numBytes” константой
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
public class WriteRandomBytes
{
private static final Random RANDOM = new Random();
private static final String FILE_NAME = "random_bytes.bin";
private static final long NUM_BYTES = 220000000000L;
public static void main(String[] args)
{
try (BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(FILE_NAME)))
{
for (long i = 0; i < NUM_BYTES; i++)
{
bos.write(RANDOM.nextInt(256));
}
}
catch (IOException e)
{
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
}
я: вставь подчеркивания в числовую константу в качестве разделителя
Бот:
Чтобы сделать long числовую константу более удобной для чтения, можно использовать подчеркивания в качестве разделителей для разделения групп цифр. Вот модифицированный код класса WriteRandomBytes с подчеркиваниями в константе NUM_BYTES:
public class WriteRandomBytes {
private static final Random RANDOM = new Random();
private static final String FILE_NAME = "random_bytes.bin";
private static final long NUM_BYTES = 220_000_000_000L;
public static void main(String[] args) {
...
Я: ChatGpt, измени имя файла, чтобы оно включало текущую отметку даты-времени
Бот:
Чтобы модифицировать константу FILE_NAME для включения текущего времени, вы можете использовать пакет java.time для получения текущей даты и времени, форматирования ее в строку и объединения с именем файла. Вот измененный код класса WriteRandomBytes, в котором в имени файла указывается штамп времени:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
public class WriteRandomBytes {
private static final Random RANDOM = new Random();
private static final String FILE_NAME = "random_bytes_" + getDateTimeStamp()
+ ".bin";
private static final long NUM_BYTES = 220_000_000_000L;
public static void main(String[] args) {
try (BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(FILE_NAME))) {
for (long i = 0; i < NUM_BYTES; i++) {
bos.write(RANDOM.nextInt(256));
}
} catch (IOException e) {
System.out.println("An error occurred while writing to the file.");
e.printStackTrace();
}
}
private static String getDateTimeStamp() {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyyMMdd_HHmmss");
return now.format(formatter);
}
}
В этом модифицированном коде Java от ChatGot константа FILE_NAME установлена в значение “random_bytes_” + getDateTimeStamp() + “.bin”. Метод getDateTimeStamp() использует класс LocalDateTime для получения текущей даты и времени, форматирует их в строку с помощью класса DateTimeFormatter и возвращает отформатированную строку. Шаблон DateTimeFormatter “yyyyMMdd_HHmmss” форматирует дату и время в строку с годом, месяцем и днем, за которыми следуют час, минута и секунда, разделенные символами подчеркивания. Отформатированная строка даты и времени затем объединяется с именем файла и расширением файла для создания полного имени файла.
Я: Напиши пример Java-контроллера с использованием Spring Framework
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.ui.Model;
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
return "greeting";
}
}
Я: Chatgpt, нужно реализовать спецификацию OpenAPI с помощью этого контроллера вместо добавления аннотаций к контроллеру
openapi: 3.0.0
info:
title: Greeting API
version: 1.0.0
paths:
/greeting:
get:
operationId: greeting
parameters:
- name: name
in: query
schema:
type: string
required: false
description: The name of the person to greet. Defaults to "World".
responses:
'200':
description: OK
content:
text/plain:
schema:
type: string
tags:
- Greetings
Это были мои запросы Chatgpt для написания Java кода. Как вам код?
Напишите в комментариях код, который Chatgpt написал для вас.