Java – язык, который сильно ориентирован на классы. Практически для любой задачи нужно создавать классы, особенно той, которая связана с данными. В этом уроке мы поговорим о том, с какими классами вам придется встречаться в коде реальных приложений. Для демонстрации будут использоваться классы, в которых встречаются не изученные на текущий момент конструкции. На них не стоит обращать внимание, но без них мы бы не смогли ничего показать.
Считается, что это из-за объектной-ориентированности Java, на самом деле это не совсем так. Java, скорее, классово ориентирована. В мире существует немало ООП языков, которые значительно отличаются от Java по устройству, а в некоторых из них даже нет классов
Когда говорят про классы, обычно говорят про предметную область, например, если взять Хекслет, это будет онлайн-обучение. В этой области есть такие понятия как курс, группа, ученик, проект, задание, квиз и многое другое. В коде все эти понятия представлены классами со своими наборами свойств и методов.
class Lesson {
private Course course;
private String name;
private String content;
private ArrayList<Member> members;
}
Это важная часть приложения для которой используются классы, но далеко не единственная. Подавляющее большинство классов в приложениях относятся к другим категориям. Если открыть наш репозиторий с приложением на Spring Boot, который вы будете использовать в более поздних курсах, то можно увидеть, что там встречаются совершенно разные классы:
DataInitializer
RsaKeyProperties
JacksonConfig
PostsCommentsController
PostCommentParamsDTO
ResourceNotFoundException
UserMapper
PostRepository
PostService
JWTUtils
User
Всего же в коде около 30 классов, и только 4 из них связаны с предметной областью. Какие мы можем выделить категории?
Исключения
Ошибки в Java тоже представлены классами. Для каждого типа ошибки создаются свои классы. Обычно это делается в библиотеках или встроено в саму Java, но бывает, что приходится создавать подобные классы для ошибок и в прикладном коде.
// Тут используется наследование от класса Exception
public class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
Data-классы
Категория, в которую попадают объекты для хранения или передачи данных куда-то дальше. Например, в объектах этих классов может содержаться конфигурация сервиса, которую можно при необходимости читать.
// Хранит ключи шифрования
public class RsaKeyProperties {
private RSAPublicKey publicKey;
private RSAPrivateKey privateKey;
}
Data-классы используются и для данных, которые приходят в программу снаружи, например через формы на сайте. Чтобы работать с этими данными внутри приложения, сначала из них нужно сделать объект с данными. И то же самое в обратную сторону, если нам нужно передать данные наружу, то они формируются из специальных объектов, которые нужны только для этой задачи. В Java объекты таких классов называют Data Transfer Object (DTO).
public class PostDTO {
private Long id;
private Long authorId;
private String slug;
private String name;
private String body;
private Date createdAt;
}
Главная особенность data-классов в том, что они не содержат никакого поведения, это просто хранилище данных для постоянного, как в случае конфигурации, или DTO для временного использования.
Сервисы
Это классы, объекты которых, используются для выполнения однотипных задач вокруг какого-то сервиса или механизма. Например, у нас может быть сервис для отправки писем или sms.
// Упрощенный пример для демонстрации
import javax.mail.*;
import javax.mail.internet.*;
public class EmailSender {
public static void sendEmail(String recipient, String subject, String text) throws MessagingException {
var message = new MimeMessage();
message.setFrom(new InternetAddress(username));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
message.setSubject(subject);
message.setText(text);
Transport.send(message);
}
}
Часто сервисы строятся вокруг каких-то внешних систем, например PayPal, для работы с платежами.
// Пример использования
var service = new PayPalService();
var payment = service.createPayment(
10.00,
"USD",
"paypal",
"sale",
"for hexlet courses",
"http://cancel.url",
"http://success.url");
Служебные объекты
Большая и разнообразная категория, в которую, например, входят классы для взаимодействия с другими программами, такими как базы данных, очереди, кеши и многое другое.
// Соединение - это служебный объект
var conn = DriverManager.getConnection("jdbc:h2:mem:hexlet_test");
var sql = "SELECT * FROM users";
var statement = conn.createStatement();
var resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getString("username"));
System.out.println(resultSet.getString("phone"));
}
statement.close();
conn.close();
Утилиты
Какие-то вспомогательные объекты для решения разнообразных задач, например, обработки строк, преобразования Markdown в HTML и тому подобное. Утилиты почти всегда похожи на обычные функции из других языков программирования.
var str = " abc ";
// Обрезает концевые пробелы
var trimmed = StringUtils.trim(str);
var str2 = "foo";
var replacedStr = StringUtils.replaceChars(str2, 'o', 'e'); // fee
var str = "abcdef";
var reversed = StringUtils.reverse(str); // fedcba
Остальное
Есть немало и других классов, которые не попали ни под одну из категорий выше. Со всем этим многообразием вы будете знакомиться не только во время обучения, но и уже в реальной работе, причем постоянно.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.