6. Оптимизация и лучшие практики
Переиспользование ObjectMapper:
Создавайте один экземпляр ObjectMapper на приложение, чтобы избежать накладных расходов на инициализацию.
Используйте Spring для внедрения ObjectMapper как бина.
Потоковая обработка:
Для больших JSON используйте JsonParser и JsonGenerator вместо полной загрузки в JsonNode.
Кэширование:
ObjectMapper автоматически кэширует метаданные классов. Избегайте частого создания новых экземпляров.
Обработка ошибок:
Обрабатывайте исключения, такие как JsonProcessingException, для повышения надежности.
Настройте DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES для игнорирования неизвестных полей.
Тестирование:
Проверяйте сериализацию/десериализацию в тестах, особенно для сложных объектов.
Используйте библиотеки, такие как jsonassert, для сравнения JSON.
Безопасность:
Избегайте десериализации непроверенных данных, чтобы предотвратить атаки (например, уязвимости в стиле XXE).
Используйте @JsonIgnoreProperties для ограничения полей.
7. Распространенные проблемы и их решения
Циклические ссылки:
Используйте @JsonIdentityInfo для обработки циклических зависимостей:
Неизвестные поля:
Настройте mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).
Неправильные форматы дат:
Используйте @JsonFormat или настройте глобальный формат через mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")).
Производительность:
Для больших объектов используйте потоковую обработку или минимизируйте использование JsonNode.
8. Пример реального сценария
Допустим, вы разрабатываете REST API для управления пользователями. JSON-запросы и ответы должны быть в определенном формате, а некоторые поля — опциональными.
POJO:
Контроллер:
Конфигурация:
#Java #middle #on_request #ObjectMapper
Переиспользование ObjectMapper:
Создавайте один экземпляр ObjectMapper на приложение, чтобы избежать накладных расходов на инициализацию.
Используйте Spring для внедрения ObjectMapper как бина.
Потоковая обработка:
Для больших JSON используйте JsonParser и JsonGenerator вместо полной загрузки в JsonNode.
Кэширование:
ObjectMapper автоматически кэширует метаданные классов. Избегайте частого создания новых экземпляров.
Обработка ошибок:
Обрабатывайте исключения, такие как JsonProcessingException, для повышения надежности.
Настройте DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES для игнорирования неизвестных полей.
Тестирование:
Проверяйте сериализацию/десериализацию в тестах, особенно для сложных объектов.
Используйте библиотеки, такие как jsonassert, для сравнения JSON.
Безопасность:
Избегайте десериализации непроверенных данных, чтобы предотвратить атаки (например, уязвимости в стиле XXE).
Используйте @JsonIgnoreProperties для ограничения полей.
7. Распространенные проблемы и их решения
Циклические ссылки:
Используйте @JsonIdentityInfo для обработки циклических зависимостей:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class User {
private Long id;
private List<User> friends;
}
Неизвестные поля:
Настройте mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).
Неправильные форматы дат:
Используйте @JsonFormat или настройте глобальный формат через mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")).
Производительность:
Для больших объектов используйте потоковую обработку или минимизируйте использование JsonNode.
8. Пример реального сценария
Допустим, вы разрабатываете REST API для управления пользователями. JSON-запросы и ответы должны быть в определенном формате, а некоторые поля — опциональными.
POJO:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
@JsonProperty("full_name")
private String name;
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate birthDate;
@JsonIgnore
private String password;
// Getters and setters
}
Контроллер:
@RestController
@RequestMapping("/api/users")
public class UserController {
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
// Логика сохранения
return ResponseEntity.ok(user);
}
}
Конфигурация:
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule()); // Для LocalDate
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
}
#Java #middle #on_request #ObjectMapper
👍2
Как отдыхать от кода, чтобы не потерять к нему интерес.
Было время, когда я изучая программирование и готовясь к собеседованиям, просиживал за изучением Java по 12-15 часов в день. Это был цейтнот и время поджимало, поэтому я не жалел себя.
И прекрасно помню, как вставая от компа, я понимал, что вообще не соображаю. Мозг, как онемевший орган, переставал реагировать на внешние раздражители.
Учиться в таком режиме было тяжело, но быстро. А ощущение отупения накапливалось и с каждым днем было все сложнее заставить себя учиться. Все сложнее было воспринимать. и что важнее - осознавать что-то новое.
Тогда я и понял, что отдых для мозга не менее важен, чем для мышц при напряженной физической работе.
Вот мои советы:
1. Программирование — это умственный стресс и нагрузка. Значит, отдых должен быть противоположным.
Многие думают: «Отдохну, полежу, сериальчик посмотрю». Это может сработать разок, но по сути — это просто пассивная стимуляция. Усталый мозг не отключается, он продолжает переваривать входящие, только уже из Netflix.
В психологии есть понятие когнитивной разрядки (cognitive offloading) — это когда мозг сознательно уходит от абстрактных нагрузок к чему-то телесному и простому.
Поэтому, будут крайне полезны:
🔵 Регулярные пешие прогулки, без телефона в руках.
🔵 Физнагрузки (бег, плавание, даже уборка) — вообще мастхев для программистов.
Я в свою очередь стараюсь заниматься хотя-бы через день. Ничего лучше так не прочищает мозг, чем 5-километровая пробежка по парку😉 .
2. Отдых не должен быть побегом. Он должен быть паузой.
Плохо, когда однажды перенагрузив мозг, ты вновь пытаешься это повторить, а он сопротивляется. Ты прямо-таки можешь ощущать его сопротивление, нежелание осознавать прочитанное.
И ты пытаешься сбежать от программирования в какие-то рандомные развлечения. Это может вызвать ненужные тебе переживания, самоосуждение, тут и до "темного попутчика" (о котором мы говорили в прошлой статье) недалеко.
Поэтому правильный, а что немаловажно, своевременный отдых — это контекстный отдых, когда ты всё ещё как бы рядом с ИТ, но без задачи «что-то выдать».
Примеры:
🔵 Чтение биографий учёных, разработчиков — это вдохновляет и не грузит.
🔵 Хобби: пайка электроники, музыка, геймдев или гейминг — лёгкое смежное времяпрепровождение.
🔵 Визуальные виды деятельности: рисование, моделирование, pixel art.
В психологии это описывается как ресторативная активность (restorative experiences) — действия, которые возвращают ощущение контроля и удовольствия от процесса.
3. Мини-проекты без цели.
Порой, когда ты перегружен "сложным" программированием и чувствуешь, что уже не вывозишь, полезно переключиться на "развлекательное" программирование - написать что-то простое и веселое.
Попробуй написать:
🔵 Телеграм - бота, который будет постить твои рандомные мысли.
🔵 Код, сортирующий папки по настроению (буквально по цветам или дням недели).
🔵 Программу, делающую любую глупость, но красиво ☺️ .
Это и есть "игра с собой" (self-determined play) — процесс, в котором мотивация рождается не из цели, а из самого процесса. В котором ты отдыхаешь, но при этом не теряешь связи с программированием и получаешь удовольствие от процесса.
4. Общение в среде программирования.
Иногда, после высокой умственной нагрузки, достаточно оставаться рядом с темой. Расслабиться и послушать подкасты, посмотреть чужие лайвкодинги.
А можно найти сообщество (похожее на наше☺️ ) и программистов, с которыми пообсуждать околопрограммерские вопросы.
Это вызывает ощущение сопричастности.
В когнитивной психологии это называется пассивное обучение (incidental learning) — когда ты усваиваешь что-то из обсуждения, даже не замечая.
А это в свою очередь, поддерживает интерес и мотивацию (Deci & Ryan, 2000).
А как вы боретесь с усталостью? Пишите в комментариях! 💪
😎
#motivation
Было время, когда я изучая программирование и готовясь к собеседованиям, просиживал за изучением Java по 12-15 часов в день. Это был цейтнот и время поджимало, поэтому я не жалел себя.
И прекрасно помню, как вставая от компа, я понимал, что вообще не соображаю. Мозг, как онемевший орган, переставал реагировать на внешние раздражители.
Учиться в таком режиме было тяжело, но быстро. А ощущение отупения накапливалось и с каждым днем было все сложнее заставить себя учиться. Все сложнее было воспринимать. и что важнее - осознавать что-то новое.
Тогда я и понял, что отдых для мозга не менее важен, чем для мышц при напряженной физической работе.
Вот мои советы:
1. Программирование — это умственный стресс и нагрузка. Значит, отдых должен быть противоположным.
Многие думают: «Отдохну, полежу, сериальчик посмотрю». Это может сработать разок, но по сути — это просто пассивная стимуляция. Усталый мозг не отключается, он продолжает переваривать входящие, только уже из Netflix.
В психологии есть понятие когнитивной разрядки (cognitive offloading) — это когда мозг сознательно уходит от абстрактных нагрузок к чему-то телесному и простому.
Поэтому, будут крайне полезны:
Я в свою очередь стараюсь заниматься хотя-бы через день. Ничего лучше так не прочищает мозг, чем 5-километровая пробежка по парку
2. Отдых не должен быть побегом. Он должен быть паузой.
Плохо, когда однажды перенагрузив мозг, ты вновь пытаешься это повторить, а он сопротивляется. Ты прямо-таки можешь ощущать его сопротивление, нежелание осознавать прочитанное.
И ты пытаешься сбежать от программирования в какие-то рандомные развлечения. Это может вызвать ненужные тебе переживания, самоосуждение, тут и до "темного попутчика" (о котором мы говорили в прошлой статье) недалеко.
Поэтому правильный, а что немаловажно, своевременный отдых — это контекстный отдых, когда ты всё ещё как бы рядом с ИТ, но без задачи «что-то выдать».
Примеры:
В психологии это описывается как ресторативная активность (restorative experiences) — действия, которые возвращают ощущение контроля и удовольствия от процесса.
И твое «Хочу программировать» останется внутри даже в перерыве от него, ведь ты не перенапрягаешься.
3. Мини-проекты без цели.
Порой, когда ты перегружен "сложным" программированием и чувствуешь, что уже не вывозишь, полезно переключиться на "развлекательное" программирование - написать что-то простое и веселое.
Попробуй написать:
Это и есть "игра с собой" (self-determined play) — процесс, в котором мотивация рождается не из цели, а из самого процесса. В котором ты отдыхаешь, но при этом не теряешь связи с программированием и получаешь удовольствие от процесса.
4. Общение в среде программирования.
Иногда, после высокой умственной нагрузки, достаточно оставаться рядом с темой. Расслабиться и послушать подкасты, посмотреть чужие лайвкодинги.
А можно найти сообщество (похожее на наше
Это вызывает ощущение сопричастности.
В когнитивной психологии это называется пассивное обучение (incidental learning) — когда ты усваиваешь что-то из обсуждения, даже не замечая.
А это в свою очередь, поддерживает интерес и мотивацию (Deci & Ryan, 2000).
Эффективный отдых — это не пассивность, а активная смена когнитивной нагрузки. Хороший отдых питает тот же источник интереса, что и программирование, но делает это без давления.
#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Предлагаем темы для разбора и публикации! 📖
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢 Один человек - одна тема.
🟢 Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!
Жду Ваших предложений!👏
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
Жду Ваших предложений!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Выбираем темы для рассмотрения в следующие выходные! 🤨
Anonymous Poll
44%
IO/NIO
15%
AOP
33%
OkHttp
7%
HATEOAS
👍3
А вы знали, что изначально компьютерный "курсор мыши" был стрелкой направленной вертикально вверх?
Когда исследовательское подразделение Palo Alto, принадлежавшее Xerox, начало разрабатывать персональные компьютеры с мышью, инженер Xerox Дуглас Энгельбарт решил сделать курсор удобнее. Он наклонил стрелку примерно на 45 градусов — так она стала выделяться среди остального текста, расположенного строго вертикально. А наклон влево обусловлен тем, что большинство людей — правши, хотя сейчас это можно легко поменять.
Proof
#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
"Технологии меняют не только экономику, но и человеческую природу."
Александр Аузан, экономист, сказал это в 2017 году на форуме "Открытые инновации" в Москве.
Биография
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Аузан, Александр Александрович
российский экономист
👍1
Базовый синтаксис Java.
Структура простой программы
Классы в Java: синтаксис и структура
Java — строго объектно-ориентированный язык, и класс является его основной строительной единицей. Классы определяют форму объектов, объединяя состояние (поля) и поведение (методы).
1. Что такое класс в Java?
Класс в Java — это шаблон, по которому создаются объекты.
Он определяет:
Поля (переменные экземпляра) — для хранения состояния объекта.
Конструкторы — для создания и инициализации объектов.
Методы — для описания поведения (в этом уроке мы их не рассматриваем).
Вложенные классы — если нужно логически сгруппировать поведение.
Блоки инициализации — для дополнительной логики во время загрузки или создания объекта.
Каждый объект — это экземпляр класса, имеющий собственное состояние (значения полей) и поведение (определённое методами).
2. Минимальная структура класса
Пример базового класса:
Структурные элементы:
class: ключевое слово для объявления класса.
ClassName: имя класса.
{}: тело класса.
В одном .java файле может быть несколько классов, но только один — public, и его имя должно совпадать с именем файла.
3. Поля класса
Поля определяют внутреннее состояние объектов и объявляются внутри класса, но вне методов или конструкторов.
Синтаксис:
Пример:
Виды полей:
Поля экземпляра — принадлежат каждому объекту.
Статические поля — общие для всех экземпляров, принадлежат самому классу.
Инициализация:
Поля экземпляра могут инициализироваться:
При объявлении;
В блоке инициализации;
В конструкторе.
4. Конструкторы
Конструктор — специальный блок кода, вызываемый при создании объекта с помощью new. Имя конструктора совпадает с именем класса, он не имеет возвращаемого значения.
Синтаксис:
Пример:
Особенности:
Если ни один конструктор не определён, компилятор автоматически добавляет конструктор без параметров.
При наличии хотя бы одного конструктора — компилятор ничего не добавляет автоматически.
Ключевое слово this используется для:
обращения к полям экземпляра;
вызова другого конструктора внутри класса.
Пример использования this:
#Java #для_новичков #beginner #java_syntax #Class
Структура простой программы
Классы в Java: синтаксис и структура
Java — строго объектно-ориентированный язык, и класс является его основной строительной единицей. Классы определяют форму объектов, объединяя состояние (поля) и поведение (методы).
1. Что такое класс в Java?
Класс в Java — это шаблон, по которому создаются объекты.
Он определяет:
Поля (переменные экземпляра) — для хранения состояния объекта.
Конструкторы — для создания и инициализации объектов.
Методы — для описания поведения (в этом уроке мы их не рассматриваем).
Вложенные классы — если нужно логически сгруппировать поведение.
Блоки инициализации — для дополнительной логики во время загрузки или создания объекта.
Каждый объект — это экземпляр класса, имеющий собственное состояние (значения полей) и поведение (определённое методами).
2. Минимальная структура класса
class ClassName {
// Поля
// Конструкторы
// Вложенные классы
// Блоки инициализации
}
Пример базового класса:
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
void introduce() {
System.out.println("Меня зовут " + name + ", мне " + age + " лет.");
}
}
Структурные элементы:
class: ключевое слово для объявления класса.
ClassName: имя класса.
{}: тело класса.
В одном .java файле может быть несколько классов, но только один — public, и его имя должно совпадать с именем файла.
3. Поля класса
Поля определяют внутреннее состояние объектов и объявляются внутри класса, но вне методов или конструкторов.
Синтаксис:
Тип имяПоля;
Тип имяПоля = начальноеЗначение;
Пример:
class Car {
String model; // Поле экземпляра
int speed = 0; // Поле с начальным значением
static int totalCars = 0; // Статическое поле
}
Виды полей:
Поля экземпляра — принадлежат каждому объекту.
Статические поля — общие для всех экземпляров, принадлежат самому классу.
Инициализация:
Поля экземпляра могут инициализироваться:
При объявлении;
В блоке инициализации;
В конструкторе.
4. Конструкторы
Конструктор — специальный блок кода, вызываемый при создании объекта с помощью new. Имя конструктора совпадает с именем класса, он не имеет возвращаемого значения.
Синтаксис:
ClassName(параметры) {
// Инициализация объекта
}
Пример:
class Student {
String name;
int grade;
Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
Student() {
this("Unknown", 0); // Вызов другого конструктора
}
}
Особенности:
Если ни один конструктор не определён, компилятор автоматически добавляет конструктор без параметров.
При наличии хотя бы одного конструктора — компилятор ничего не добавляет автоматически.
Ключевое слово this используется для:
обращения к полям экземпляра;
вызова другого конструктора внутри класса.
Пример использования this:
class Book {
String title;
Book(String title) {
this.title = title;
}
}
#Java #для_новичков #beginner #java_syntax #Class
👍3
5. Вложенные классы
Классы могут быть определены внутри других классов. Это удобно для логического объединения компонентов.
Виды вложенных классов:
Статический вложенный класс (static)
Внутренний класс (нестатический)
Локальный класс (внутри метода)
Анонимный класс (без имени, создаётся на лету)
Пример статического вложенного класса:
Пример внутреннего класса:
Создание экземпляров:
6. Блоки инициализации
Блоки инициализации выполняются перед выполнением конструктора.
Существуют два вида:
Экземплярный блок - выполняется каждый раз при создании объекта, до конструктора.
Статический блок - выполняется один раз при загрузке класса в память (JVM).
Порядок инициализации:
Статические поля → статические блоки (в порядке появления).
Поля экземпляра → блоки экземпляра → конструктор (в порядке появления в коде).
7. Дополнительные структурные аспекты
Несколько классов в одном файле:
Только один класс может быть public, и его имя должно совпадать с именем файла.
Структура .java файла:
Каждый класс принадлежит пакету. Структура пакетов влияет на компиляцию, размещение файлов и импорт.
8. Лучшие практики по структуре
Инкапсуляция полей через геттеры/сеттеры — отдельная тема, но важно помнить, что прямой доступ к полям может быть нежелателен.
Минимизация дублирования кода в конструкторах — через this(...).
Инициализация по умолчанию — используется с осторожностью; рекомендуется явно задавать значения.
9. Типичные ошибки и подводные камни
Неинициализированные поля: хотя JVM задаёт значения по умолчанию (0, null, false), это может приводить к логическим ошибкам.
Статические поля: избыточное или некорректное использование может привести к ошибкам синхронизации и неправильному поведению.
Повторяющийся код в конструкторах: рекомендуется использовать цепочку вызовов this(...).
#Java #для_новичков #beginner #java_syntax #Class
Классы могут быть определены внутри других классов. Это удобно для логического объединения компонентов.
Виды вложенных классов:
Статический вложенный класс (static)
Внутренний класс (нестатический)
Локальный класс (внутри метода)
Анонимный класс (без имени, создаётся на лету)
Пример статического вложенного класса:
class Outer {
static class StaticNested {
void display() {
System.out.println("Static nested class");
}
}
}
Пример внутреннего класса:
class Outer {
class Inner {
void display() {
System.out.println("Inner class");
}
}
}
Создание экземпляров:
Outer.StaticNested nested = new Outer.StaticNested();
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
6. Блоки инициализации
Блоки инициализации выполняются перед выполнением конструктора.
Существуют два вида:
Экземплярный блок - выполняется каждый раз при создании объекта, до конструктора.
class Example {
{
System.out.println("Экземплярный блок инициализации");
}
}
Статический блок - выполняется один раз при загрузке класса в память (JVM).
class Example {
static {
System.out.println("Статический блок инициализации");
}
}
Порядок инициализации:
Статические поля → статические блоки (в порядке появления).
Поля экземпляра → блоки экземпляра → конструктор (в порядке появления в коде).
7. Дополнительные структурные аспекты
Несколько классов в одном файле:
class A {
// основной класс
}
class B {
// вспомогательный
}
Только один класс может быть public, и его имя должно совпадать с именем файла.
Структура .java файла:
package my.project;
import java.util.List;
class Example {
// тело класса
}
Каждый класс принадлежит пакету. Структура пакетов влияет на компиляцию, размещение файлов и импорт.
8. Лучшие практики по структуре
Инкапсуляция полей через геттеры/сеттеры — отдельная тема, но важно помнить, что прямой доступ к полям может быть нежелателен.
Минимизация дублирования кода в конструкторах — через this(...).
Инициализация по умолчанию — используется с осторожностью; рекомендуется явно задавать значения.
9. Типичные ошибки и подводные камни
Неинициализированные поля: хотя JVM задаёт значения по умолчанию (0, null, false), это может приводить к логическим ошибкам.
Статические поля: избыточное или некорректное использование может привести к ошибкам синхронизации и неправильному поведению.
Повторяющийся код в конструкторах: рекомендуется использовать цепочку вызовов this(...).
#Java #для_новичков #beginner #java_syntax #Class
👍4
Что выведет код?
#Tasks
class A300625 {
{ System.out.print("1"); }
public A300625() { System.out.print("2"); }
}
class B300625 extends A300625 {
{ System.out.print("3"); }
public B300625() { System.out.print("4"); }
}
public class Task300625 {
public static void main(String[] args) {
new B300625();
}
}
#Tasks
👍1
🔥1😱1