+ * Алгоритм работы: + *
+ * Для сериализации учитываются только те поля, которые помечены аннотацией {@link CsvColumn}.
+ * Если список пустой или равен {@code null}, выбрасывается {@link NoDataCSVException}.
+ *
+ * @param data список объектов для записи
+ * @param fileName имя файла, в который будет записан результат
+ * @throws IOException если произошла ошибка при записи в файл
+ * @throws NoDataCSVException если список {@code data} пустой или равен {@code null}
+ */
+ @Override
+ public void writeToFile(List> data, String fileName) throws IOException {
+ if (data == null || data.isEmpty()) throw new NoDataCSVException();
+
+ Class> clazz = data.get(0).getClass();
+ List
+ * Может применяться только к полям. Сохраняется во время выполнения,
+ * что позволяет работать с ней через Reflection.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface CsvColumn {
+ /**
+ * Имя колонки в CSV‑файле, соответствующее данному полю.
+ *
+ * @return название столбца в CSV
+ */
+ String name();
+}
diff --git a/src/main/java/org/writer/exception/NoDataCSVException.java b/src/main/java/org/writer/exception/NoDataCSVException.java
new file mode 100644
index 0000000..5d7b01b
--- /dev/null
+++ b/src/main/java/org/writer/exception/NoDataCSVException.java
@@ -0,0 +1,13 @@
+package org.writer.exception;
+
+/**
+ * Исключение {@code NoDataCSVException} выбрасывается в случаях,
+ * когда отсутствуют данные для записи в CSV‑файл.
+ */
+public class NoDataCSVException extends RuntimeException {
+ public static final String MSG = "There is no data to write to CSV";
+
+ public NoDataCSVException() {
+ super(MSG);
+ }
+}
diff --git a/src/main/java/org/writer/model/Person.java b/src/main/java/org/writer/model/Person.java
index ba8576b..ffd2574 100644
--- a/src/main/java/org/writer/model/Person.java
+++ b/src/main/java/org/writer/model/Person.java
@@ -3,20 +3,48 @@
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
-
+import org.writer.annotation.CsvColumn;
+
+/**
+ * Класс {@code Person} представляет модель человека,
+ * данные которого могут быть сериализованы в CSV‑файл.
+ *
+ * Для каждого поля используется аннотация {@link CsvColumn},
+ * которая определяет название соответствующей колонки в CSV‑отчёте.
+ */
@Data
@Builder
@AllArgsConstructor
public class Person {
+ /**
+ * Имя человека.
+ */
+ @CsvColumn(name = "First name")
private String firstName;
+ /**
+ * Фамилия человека.
+ */
+ @CsvColumn(name = "Last name")
private String lastName;
+ /**
+ * День рождения (число месяца).
+ */
+ @CsvColumn(name = "Day of birth")
private int dayOfBirth;
+ /**
+ * Месяц рождения.
+ */
+ @CsvColumn(name = "Month of birth")
private Months monthOfBirth;
+ /**
+ * Год рождения.
+ */
+ @CsvColumn(name = "Year of birth")
private int yearOfBirth;
}
diff --git a/src/main/java/org/writer/model/Student.java b/src/main/java/org/writer/model/Student.java
index 2b549c4..a103fa4 100644
--- a/src/main/java/org/writer/model/Student.java
+++ b/src/main/java/org/writer/model/Student.java
@@ -3,15 +3,31 @@
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import org.writer.annotation.CsvColumn;
import java.util.List;
+/**
+ * Класс {@code Student} представляет модель студента,
+ * данные которого могут быть сериализованы в CSV‑файл.
+ *
+ * Для каждого поля используется аннотация {@link CsvColumn},
+ * которая определяет название соответствующей колонки в CSV‑отчёте.
+ */
@Data
@Builder
@AllArgsConstructor
public class Student {
+ /**
+ * Имя студента.
+ */
+ @CsvColumn(name = "Student name")
private String name;
+ /**
+ * Список результатов (оценок) студента.
+ */
+ @CsvColumn(name = "Student score")
private List