Ты не хочешь стать программистом.
Ты хочешь, чтобы тебе дали 100500 рублей в минуту, удаленку и 3 рабочих часа в день🏝
Нет?😂
Не ври, ладно? Хотя-бы самому себе😏
А теперь задай себе вопрос - зачем ты здесь. На этом канале? В программировании?
Если Ты хочешь, чтобы программист появился внутри тебя сам, без боли, без тупежа, без стыда за глупые вопросы, особенно если ты до этого был(а) шахтером/строителем/токарем/поваром - у меня для тебя плохие новости.
Если Ты хочешь чтобы кто-то дал «тот самый» курс, «тот самый» язык, «ту самую» кнопку, нажав на которую — фух и ты программист с зп в 500к, то как говорилнаркоман Паша Техник - "ты что-то перепутал" 🤣
Так не будет.
Извини если обломал🤷♀️
Сейчас, в жесткой конкуренции, начинание пути в IT, потребует от Тебя не просто уйти в минус.
Это и учеба вечерами после работы, куча пет-проектов в никуда, бесконечное количество собесов с «ну вы нам пока не подходите».
Ты заполняешь резюме на hh.ru с мыслью:
«Я считаю, что готов работать, дайте мне работу!»
Но на рынок переполнен «готовыми».
Каждый хочет сидеть в нижнем белье перед монитором с любимой кошкой на коленях и получать за это хорошую зп.
Каждый хочет пить в офисе чай с печеньками и быть востребованным специалистом.
А чем ты лучше их?
И тогда, с этими мыслями 90% сдаются.
Уходят обратно в стабильное/известное/удобное.
Ты ведь тоже думал уйти, да?😏
Я точно думал. И не раз😔
Как я писал здесь, здесь и здесь - путь не будет легким.
Но он совершенно точно преодолим.
Если смог я - сможешь и ты.
Но!
Если Ты до сих пор листаешь списки курсов, сравниваешь Java и Python, читаешь отзывы на Stepik и думаешь:
«Вот если бы найти один, но самый лучший — всё бы пошло».
Знай - это ловушка. Курс не станет твоей волшебной палочкой.
Он не спасёт от ощущения «ничего не понятно», он не вытащит тебя в поток.
Потому что всё равно будет сложно.
Пока ты не взрастишь в себе интерес к созиданию через программирование.☺️
Если Ты до сих пор ждёшь вдохновения -
Знай - оно появится в момент, когда код заработает.
Ты думаешь, что сначала надо захотеть, а потом начать.
На деле — сначала ты начинаешь, и только потом хочешь.
Мотивация приходит не в начале.
Когда твой проект сбилдится, все тесты пройдут, тогда и появляется кайф. И мотивация. И желание.
А не из мотивационных видео, моих статей или чужих успехов.
Есть хорошая цитата Марка Твена🤓 :
Поэтому мой совет (который я даю всем кто попросит) :
"Если Ты идешь в программирование за деньгами и "легкой" работой - либо взрасти в себе желание к созиданию, либо оно превратится для тебя в один из самых страшных кошмаров, с которым ты точно не справишься."
И помни:
Ты не ленивый.
Ты просто попал в ловушку рекламы и иллюзий.
Мы все туда попали.☺️ 😉
Но если ты все-такие решил(а) стать программистом — нужно перестать ждать и начать бороться, точно понимая, зачем и для чего тебе это.
Одно я могу обещать Тебе точно: если ты болеешь как и я - все получится.💪
Понравилась статья - поделись с другом, позови его на канал и будет тебе моя благодарность 🤝
😎
#motivation
Ты хочешь, чтобы тебе дали 100500 рублей в минуту, удаленку и 3 рабочих часа в день
Нет?
Не ври, ладно? Хотя-бы самому себе
В (уже) далеких 1990-х я увидел первый компьютер.
В местном "Доме творчества" поставили несколько, и нас, детей, повели посмотреть на них. Дали поиграть в какую-то игру на зеленых экранах. Мне кажется тогда я и заболел компьютерами. Но лишь спустя 20 лет я смог позволить себе купить его. А еще спустя 11 лет я познакомился с программированием.
Все эти годы я болел возможностью создавать что-то. Что-то свое. Ведь в детстве это казалось чудом - по экрану ездит квадратная машина и ты ей управляешь.
Много позже, разрабатывая сервера на Dayz и ARMA, реализуя в том мире все, что мог вообразить (и что позволяли знания), я все еще болел этим. Но по настоящему программировать я наверно я боялся, это казалось невозможным.
А потом пришла Java💃
И пришла возможность написать все что я пожелаю.
А теперь задай себе вопрос - зачем ты здесь. На этом канале? В программировании?
Если Ты хочешь, чтобы программист появился внутри тебя сам, без боли, без тупежа, без стыда за глупые вопросы, особенно если ты до этого был(а) шахтером/строителем/токарем/поваром - у меня для тебя плохие новости.
Если Ты хочешь чтобы кто-то дал «тот самый» курс, «тот самый» язык, «ту самую» кнопку, нажав на которую — фух и ты программист с зп в 500к, то как говорил
Так не будет.
Извини если обломал
Сейчас, в жесткой конкуренции, начинание пути в IT, потребует от Тебя не просто уйти в минус.
Это и учеба вечерами после работы, куча пет-проектов в никуда, бесконечное количество собесов с «ну вы нам пока не подходите».
Ты заполняешь резюме на hh.ru с мыслью:
«Я считаю, что готов работать, дайте мне работу!»
Но на рынок переполнен «готовыми».
Каждый хочет сидеть в нижнем белье перед монитором с любимой кошкой на коленях и получать за это хорошую зп.
Каждый хочет пить в офисе чай с печеньками и быть востребованным специалистом.
А чем ты лучше их?
И тогда, с этими мыслями 90% сдаются.
Уходят обратно в стабильное/известное/удобное.
Ты ведь тоже думал уйти, да?
Я точно думал. И не раз
Как я писал здесь, здесь и здесь - путь не будет легким.
Но он совершенно точно преодолим.
Если смог я - сможешь и ты.
Но!
Если Ты до сих пор листаешь списки курсов, сравниваешь Java и Python, читаешь отзывы на Stepik и думаешь:
«Вот если бы найти один, но самый лучший — всё бы пошло».
Знай - это ловушка. Курс не станет твоей волшебной палочкой.
Он не спасёт от ощущения «ничего не понятно», он не вытащит тебя в поток.
Потому что всё равно будет сложно.
Пока ты не взрастишь в себе интерес к созиданию через программирование.
Если Ты до сих пор ждёшь вдохновения -
Знай - оно появится в момент, когда код заработает.
Ты думаешь, что сначала надо захотеть, а потом начать.
На деле — сначала ты начинаешь, и только потом хочешь.
Мотивация приходит не в начале.
Когда твой проект сбилдится, все тесты пройдут, тогда и появляется кайф. И мотивация. И желание.
А не из мотивационных видео, моих статей или чужих успехов.
Есть хорошая цитата Марка Твена
«Выбери себе работу по душе, и тебе не придётся работать ни одного дня в своей жизни»
(«Choose a job you love, and you will never have to work a day in your life»).
Поэтому мой совет
"Если Ты идешь в программирование за деньгами и "легкой" работой - либо взрасти в себе желание к созиданию, либо оно превратится для тебя в один из самых страшных кошмаров, с которым ты точно не справишься."
И помни:
Ты не ленивый.
Ты просто попал в ловушку рекламы и иллюзий.
Мы все туда попали.
Но если ты все-такие решил(а) стать программистом — нужно перестать ждать и начать бороться, точно понимая, зачем и для чего тебе это.
Одно я могу обещать Тебе точно: если ты болеешь как и я - все получится.
#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1 1
Немного о неблокирующих запросах на внешние API с WebFlux, на примере Dadata.ru
Видео посвященное изучению WebFlux в Java.
Что мы рассмотрели:
- Интересное API - Dadata.ru,
- Что такое неблокирующие запросы и зачем они нужны,
- Краем коснулись WebFlux и объект Mono,
- написали демонстрационный код и протестировали его работу через Postman.
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!
Видео посвященное изучению WebFlux в Java.
Что мы рассмотрели:
- Интересное API - Dadata.ru,
- Что такое неблокирующие запросы и зачем они нужны,
- Краем коснулись WebFlux и объект Mono,
- написали демонстрационный код и протестировали его работу через Postman.
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!
👍4
А вы знали, что первыми компьютерами, которые оснащались специальными интегральными схемами для дисплея и ускорения 2D графики были 8-битный Atari 400 и Atari 800?
В конце 1970-х годов 8-битный Atari 400 и Atari 800 были первыми компьютерами, которые оснащались специальными интегральными схемами для дисплея и ускорения 2D графики, они назывались ANTIC (Alpha-Numeric Television Interface) и CTIA (Colleen TIA). Вторая IC была впоследствии заменена на GTIA (George’s Television Interface Adapter). Майнер, который разработал ANTIC и CTIA, являлся главным разработчиком Amiga и считается его создателем (стартовал как проект Lorraine). Amiga был первым серийным компьютером, оборудованным специальным 2D акселератором (блиттер). Компьютер получил всеобщее признание благодаря своим графическим возможностям и продавался в огромных количествах по всему миру.
Proof
#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
"Компьютеры — это не замена ученого, а его помощник."
Евгений Велихов, физик и академик, сказал это в 1980-х годах на конференции по вычислительным системам в Москве.
Биография
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
TACC
Биография физика Евгения Велихова
Академик РАН умер 6 декабря 2024 года
👍1
Профили, настройки и переменные в Maven
Maven предоставляет мощные инструменты для адаптивной конфигурации проектов, включая профили, настройки в файле settings.xml и использование переменных. Эти механизмы позволяют гибко настраивать сборку в зависимости от окружения, операционной системы или пользовательских условий, а также безопасно управлять конфиденциальными данными.
Профили: структура, активация, условия
Профили в Maven позволяют определять альтернативные конфигурации сборки, которые активируются при выполнении определенных условий. Они задаются в файле POM.xml в секции <profiles> или в файле settings.xml. Профили используются для настройки зависимостей, плагинов, свойств или ресурсов в зависимости от окружения (например, разработка, тестирование, продакшен).
Структура профиля
Профиль определяется в <profile> и может включать те же элементы, что и основной POM-файл: <dependencies>, <plugins>, <properties>, <build> и т.д.
Пример:
В памяти Maven загружает все профили из POM.xml и settings.xml в объектную модель проекта (POM model) во время инициализации. Активные профили объединяются с основной конфигурацией, создавая итоговую модель сборки. Это увеличивает потребление памяти, особенно если профили содержат сложные конфигурации или множество зависимостей.
Активация профилей
Профили активируются следующими способами:
Явная активация через командную строку:
Автоматическая активация по условиям:
Профили могут активироваться автоматически на основе условий, заданных в секции <activation>. Maven проверяет эти условия во время загрузки POM-файла, что требует дополнительных вычислений и памяти для оценки.
Активация по системным переменным
Профиль активируется, если указанная системная переменная (-Dkey=value) присутствует или имеет определенное значение:
Запуск:
Активация по операционной системе
Профиль активируется в зависимости от операционной системы, определенной через параметры os.name, os.family, os.arch или os.version:
Maven использует API System.getProperty("os.name") для проверки ОС, что не требует значительных ресурсов памяти, так как информация об ОС уже доступна JVM.
#Java #middle #Maven #Profiles #Settings #m2
Maven предоставляет мощные инструменты для адаптивной конфигурации проектов, включая профили, настройки в файле settings.xml и использование переменных. Эти механизмы позволяют гибко настраивать сборку в зависимости от окружения, операционной системы или пользовательских условий, а также безопасно управлять конфиденциальными данными.
Профили: структура, активация, условия
Профили в Maven позволяют определять альтернативные конфигурации сборки, которые активируются при выполнении определенных условий. Они задаются в файле POM.xml в секции <profiles> или в файле settings.xml. Профили используются для настройки зависимостей, плагинов, свойств или ресурсов в зависимости от окружения (например, разработка, тестирование, продакшен).
Структура профиля
Профиль определяется в <profile> и может включать те же элементы, что и основной POM-файл: <dependencies>, <plugins>, <properties>, <build> и т.д.
Пример:
<profiles>
<profile>
<id>dev</id>
<properties>
<env>development</env>
</properties>
<dependencies>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.7.1</version>
</dependency>
</dependencies>
</profile>
</profiles>
В памяти Maven загружает все профили из POM.xml и settings.xml в объектную модель проекта (POM model) во время инициализации. Активные профили объединяются с основной конфигурацией, создавая итоговую модель сборки. Это увеличивает потребление памяти, особенно если профили содержат сложные конфигурации или множество зависимостей.
Активация профилей
Профили активируются следующими способами:
Явная активация через командную строку:
mvn package -Pdev
Флаг -P указывает идентификатор профиля (id). Можно активировать несколько профилей: -Pdev,test.
Автоматическая активация по условиям:
Профили могут активироваться автоматически на основе условий, заданных в секции <activation>. Maven проверяет эти условия во время загрузки POM-файла, что требует дополнительных вычислений и памяти для оценки.
Активация по системным переменным
Профиль активируется, если указанная системная переменная (-Dkey=value) присутствует или имеет определенное значение:
<profile>
<id>prod</id>
<activation>
<property>
<name>env</name>
<value>production</value>
</property>
</activation>
</profile>
Запуск:
mvn package -Denv=production
Maven загружает системные свойства в память через System.getProperties() и сравнивает их с условиями активации. Это минимально нагружает память, так как свойства уже доступны в JVM.
Активация по операционной системе
Профиль активируется в зависимости от операционной системы, определенной через параметры os.name, os.family, os.arch или os.version:
<profile>
<id>windows</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
</profile>
Maven использует API System.getProperty("os.name") для проверки ОС, что не требует значительных ресурсов памяти, так как информация об ОС уже доступна JVM.
#Java #middle #Maven #Profiles #Settings #m2
👍2
Активация по наличию файла
Профиль активируется, если указанный файл существует (или отсутствует):
Maven выполняет файловую проверку через API java.io.File, что требует минимальных ресурсов, но может замедлить инициализацию при большом количестве профилей с проверками файлов.
Другие условия
JDK: Активация по версии Java (<jdk>).
Property absence: Активация, если свойство отсутствует (<property><name>!key</name></property>).
Default activation: Профиль может быть активен по умолчанию (<activation><activeByDefault>true</activeByDefault></activation>).
В памяти Maven хранит список всех профилей и их условия. При загрузке проекта Maven оценивает условия для каждого профиля, создавая временные объекты для хранения результатов проверки. Если профиль активируется, его конфигурация объединяется с основной POM-моделью, что может увеличить объем памяти, особенно в многомодульных проектах.
settings.xml: Локальный и глобальный
Файл settings.xml определяет глобальные или пользовательские настройки Maven, такие как репозитории, прокси, серверы и профили.
Существует два уровня settings.xml:
Глобальный: Расположен в $MAVEN_HOME/conf/settings.xml (обычно в директории установки Maven). Применяется ко всем пользователям системы.
Локальный: Расположен в ~/.m2/settings.xml. Применяется только к текущему пользователю и имеет приоритет над глобальным.
Maven загружает оба файла в память во время инициализации, создавая объектную модель настроек (Settings object). Локальный settings.xml переопределяет глобальный. Если файл отсутствует, Maven использует значения по умолчанию (например, Maven Central в качестве репозитория).
Основные элементы settings.xml
В памяти Maven объединяет настройки из settings.xml с моделью POM, создавая единую конфигурацию. Это увеличивает объем памяти, особенно если settings.xml содержит множество профилей или репозиториев.
#Java #middle #Maven #Profiles #Settings #m2
Профиль активируется, если указанный файл существует (или отсутствует):
<profile>
<id>local-config</id>
<activation>
<file>
<exists>${basedir}/local-config.properties</exists>
</file>
</activation>
</profile>
Maven выполняет файловую проверку через API java.io.File, что требует минимальных ресурсов, но может замедлить инициализацию при большом количестве профилей с проверками файлов.
Другие условия
JDK: Активация по версии Java (<jdk>).
Property absence: Активация, если свойство отсутствует (<property><name>!key</name></property>).
Default activation: Профиль может быть активен по умолчанию (<activation><activeByDefault>true</activeByDefault></activation>).
В памяти Maven хранит список всех профилей и их условия. При загрузке проекта Maven оценивает условия для каждого профиля, создавая временные объекты для хранения результатов проверки. Если профиль активируется, его конфигурация объединяется с основной POM-моделью, что может увеличить объем памяти, особенно в многомодульных проектах.
settings.xml: Локальный и глобальный
Файл settings.xml определяет глобальные или пользовательские настройки Maven, такие как репозитории, прокси, серверы и профили.
Существует два уровня settings.xml:
Глобальный: Расположен в $MAVEN_HOME/conf/settings.xml (обычно в директории установки Maven). Применяется ко всем пользователям системы.
Локальный: Расположен в ~/.m2/settings.xml. Применяется только к текущему пользователю и имеет приоритет над глобальным.
Maven загружает оба файла в память во время инициализации, создавая объектную модель настроек (Settings object). Локальный settings.xml переопределяет глобальный. Если файл отсутствует, Maven использует значения по умолчанию (например, Maven Central в качестве репозитория).
Основные элементы settings.xml
<mirrors>: Позволяет перенаправлять запросы к репозиториям на зеркала для ускорения загрузки или обхода ограничений. Пример:
<mirrors>
<mirror>
<id>central-mirror</id>
<url>https://repo.example.com/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
Maven загружает конфигурацию зеркал в память и использует ее при разрешении зависимостей, что минимально влияет на потребление ресурсов.
<proxies>: Настраивает прокси для доступа к удаленным репозиториям. Пример:
<proxies>
<proxy>
<id>example-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.example.com</host>
<port>8080</port>
</proxy>
</proxies>
Конфигурация прокси загружается в память как часть объекта Settings, что не требует значительных ресурсов.
<servers>: Хранит учетные данные для доступа к защищенным репозиториям. Пример:
<servers>
<server>
<id>nexus</id>
<username>user</username>
<password>pass</password>
</server>
</servers>
Maven загружает учетные данные в память, но они могут быть зашифрованы для безопасности (см. ниже).
<profiles>: Определяет профили, аналогичные профилям в POM.xml, но на уровне настроек. Они применяются ко всем проектам пользователя. Пример:
<profiles>
<profile>
<id>custom-repo</id>
<repositories>
<repository>
<id>nexus</id>
<url>https://nexus.example.com/repository/maven-public/</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>custom-repo</activeProfile>
</activeProfiles>
В памяти Maven объединяет настройки из settings.xml с моделью POM, создавая единую конфигурацию. Это увеличивает объем памяти, особенно если settings.xml содержит множество профилей или репозиториев.
#Java #middle #Maven #Profiles #Settings #m2
👍2
Переменные
Maven поддерживает несколько типов переменных, которые используются для динамической настройки конфигурации.
User-defined ${} переменные
Пользовательские переменные определяются в <properties> в POM.xml или settings.xml.
Environment variables
Переменные окружения (например, JAVA_HOME, PATH) доступны через ${env.VARIABLE_NAME}.
System properties (-D)
Системные свойства задаются через флаг -D в командной строке:
Они доступны в POM.xml через ${propertyName}.
Переменные из settings.xml и POM
settings.xml: Переменные задаются в <properties> внутри профилей или глобально. Они применяются ко всем проектам.
POM.xml: Переменные в <properties> применяются только к текущему проекту или наследуются дочерними модулями.
Maven объединяет все переменные в единую модель свойств в памяти. Порядок приоритета: системные свойства (-D) > переменные окружения > свойства из POM.xml > свойства из settings.xml. Это требует дополнительных вычислений для разрешения конфликтов имен переменных.
#Java #middle #Maven #Profiles #Settings #m2
Maven поддерживает несколько типов переменных, которые используются для динамической настройки конфигурации.
User-defined ${} переменные
Пользовательские переменные определяются в <properties> в POM.xml или settings.xml.
<properties>
<java.version>11</java.version>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
Переменные загружаются в память как часть POM-модели или объекта Settings. Maven заменяет ${} на значения во время парсинга, что требует минимальных ресурсов, так как это операция на уровне строк.
Environment variables
Переменные окружения (например, JAVA_HOME, PATH) доступны через ${env.VARIABLE_NAME}.
<properties>
<java.home>${env.JAVA_HOME}</java.home>
</properties>
Maven получает переменные окружения через System.getenv(), что не нагружает память, так как данные уже доступны JVM.
System properties (-D)
Системные свойства задаются через флаг -D в командной строке:
mvn package -Denv=production
Они доступны в POM.xml через ${propertyName}.
<properties>
<env>${env}</env>
</properties>
Системные свойства загружаются в память через System.getProperties(). Они имеют приоритет над переменными из POM.xml или settings.xml.
Переменные из settings.xml и POM
settings.xml: Переменные задаются в <properties> внутри профилей или глобально. Они применяются ко всем проектам.
POM.xml: Переменные в <properties> применяются только к текущему проекту или наследуются дочерними модулями.
Maven объединяет все переменные в единую модель свойств в памяти. Порядок приоритета: системные свойства (-D) > переменные окружения > свойства из POM.xml > свойства из settings.xml. Это требует дополнительных вычислений для разрешения конфликтов имен переменных.
#Java #middle #Maven #Profiles #Settings #m2
👍2
Secure settings: хранение credentials
Для безопасного хранения учетных данных (например, паролей для репозиториев) Maven поддерживает шифрование в settings.xml.
Процесс:
Создание мастер-пароля:
Создает зашифрованный мастер-пароль, который сохраняется в ~/.m2/settings-security.xml:
Шифрование пароля сервера:
Создает зашифрованный пароль для <server> в settings.xml:
Maven использует библиотеку Plexus Cipher для шифрования и дешифрования. Зашифрованные данные загружаются в память как строки, а дешифрование происходит во время обращения к репозиториям. Это минимально влияет на память, но требует правильной настройки settings-security.xml.
.m2 директория
Директория ~/.m2 — это локальный репозиторий и хранилище пользовательских настроек Maven.
Основные компоненты:
repository/: Хранит кэшированные зависимости, плагины и их POM-файлы. Структура: groupId/artifactId/version/. Это снижает потребность в сетевых запросах, но увеличивает использование диска.
settings.xml: Локальный файл настроек пользователя.
settings-security.xml: Хранит зашифрованный мастер-пароль.
toolchains.xml: Определяет альтернативные JDK для сборки (например, для кросс-компиляции).
Maven загружает содержимое ~/.m2/settings.xml и settings-security.xml в память при старте. Локальный репозиторий не загружается полностью, но Maven читает метаданные (POM-файлы) по мере необходимости, что оптимизирует использование памяти. Однако при большом количестве зависимостей или устаревших артефактов в ~/.m2/repository может потребоваться очистка для освобождения места на диске.
Нюансы и внутренние механизмы
Управление памятью:
Maven загружает POM.xml, settings.xml и профили в память как объектные модели (POM model и Settings). Это увеличивает потребление памяти в многомодульных проектах или при большом количестве профилей.
Активация профилей требует проверки условий, что создает временные объекты в памяти для хранения результатов.
Для оптимизации используйте минимальное количество профилей и избегайте сложных условий активации.
Конфликты переменных:
Переменные с одинаковыми именами из разных источников (системные, окружения, POM, settings.xml) могут конфликтовать. Maven разрешает их по приоритету, но это требует дополнительных вычислений.
Используйте уникальные имена для пользовательских переменных, чтобы избежать путаницы.
Безопасность:
Хранение паролей в открытом виде в settings.xml небезопасно. Всегда используйте шифрование с --encrypt-password.
Убедитесь, что settings-security.xml имеет ограниченные права доступа (например, chmod 600).
Многомодульные проекты:
Профили из родительского POM.xml наследуются дочерними модулями, но могут быть переопределены. Это увеличивает сложность объединения конфигураций в памяти.
Используйте <pluginManagement> и <dependencyManagement> для централизованного управления.
Параллельное выполнение:
При использовании флага -T Maven загружает конфигурации для каждого модуля параллельно, что увеличивает пиковое потребление памяти из-за одновременной обработки нескольких POM-моделей и профилей.
Кэширование:
Локальный репозиторий (~/.m2/repository) кэширует зависимости, что снижает сетевые запросы, но требует периодической очистки для удаления устаревших SNAPSHOT-версий.
Maven кэширует результаты проверки условий активации профилей в рамках одной сессии, что ускоряет повторные сборки.
Отладка:
Используйте флаг -X для вывода подробной информации о загрузке профилей, переменных и настроек.
Плагин help:effective-settings показывает итоговую конфигурацию settings.xml:mvn help:effective-settings
Плагин help:effective-pom показывает объединенную модель POM с учетом активных профилей:mvn help:effective-pom
#Java #middle #Maven #Profiles #Settings #m2
Для безопасного хранения учетных данных (например, паролей для репозиториев) Maven поддерживает шифрование в settings.xml.
Процесс:
Создание мастер-пароля:
mvn --encrypt-master-password
Создает зашифрованный мастер-пароль, который сохраняется в ~/.m2/settings-security.xml:
<settingsSecurity>
<master>{encryptedMasterPassword}</master>
</settingsSecurity>
Шифрование пароля сервера:
mvn --encrypt-password
Создает зашифрованный пароль для <server> в settings.xml:
<server>
<id>nexus</id>
<username>user</username>
<password>{encryptedPassword}</password>
</server>
Maven использует библиотеку Plexus Cipher для шифрования и дешифрования. Зашифрованные данные загружаются в память как строки, а дешифрование происходит во время обращения к репозиториям. Это минимально влияет на память, но требует правильной настройки settings-security.xml.
.m2 директория
Директория ~/.m2 — это локальный репозиторий и хранилище пользовательских настроек Maven.
Основные компоненты:
repository/: Хранит кэшированные зависимости, плагины и их POM-файлы. Структура: groupId/artifactId/version/. Это снижает потребность в сетевых запросах, но увеличивает использование диска.
settings.xml: Локальный файл настроек пользователя.
settings-security.xml: Хранит зашифрованный мастер-пароль.
toolchains.xml: Определяет альтернативные JDK для сборки (например, для кросс-компиляции).
Maven загружает содержимое ~/.m2/settings.xml и settings-security.xml в память при старте. Локальный репозиторий не загружается полностью, но Maven читает метаданные (POM-файлы) по мере необходимости, что оптимизирует использование памяти. Однако при большом количестве зависимостей или устаревших артефактов в ~/.m2/repository может потребоваться очистка для освобождения места на диске.
Нюансы и внутренние механизмы
Управление памятью:
Maven загружает POM.xml, settings.xml и профили в память как объектные модели (POM model и Settings). Это увеличивает потребление памяти в многомодульных проектах или при большом количестве профилей.
Активация профилей требует проверки условий, что создает временные объекты в памяти для хранения результатов.
Для оптимизации используйте минимальное количество профилей и избегайте сложных условий активации.
Конфликты переменных:
Переменные с одинаковыми именами из разных источников (системные, окружения, POM, settings.xml) могут конфликтовать. Maven разрешает их по приоритету, но это требует дополнительных вычислений.
Используйте уникальные имена для пользовательских переменных, чтобы избежать путаницы.
Безопасность:
Хранение паролей в открытом виде в settings.xml небезопасно. Всегда используйте шифрование с --encrypt-password.
Убедитесь, что settings-security.xml имеет ограниченные права доступа (например, chmod 600).
Многомодульные проекты:
Профили из родительского POM.xml наследуются дочерними модулями, но могут быть переопределены. Это увеличивает сложность объединения конфигураций в памяти.
Используйте <pluginManagement> и <dependencyManagement> для централизованного управления.
Параллельное выполнение:
При использовании флага -T Maven загружает конфигурации для каждого модуля параллельно, что увеличивает пиковое потребление памяти из-за одновременной обработки нескольких POM-моделей и профилей.
Кэширование:
Локальный репозиторий (~/.m2/repository) кэширует зависимости, что снижает сетевые запросы, но требует периодической очистки для удаления устаревших SNAPSHOT-версий.
Maven кэширует результаты проверки условий активации профилей в рамках одной сессии, что ускоряет повторные сборки.
Отладка:
Используйте флаг -X для вывода подробной информации о загрузке профилей, переменных и настроек.
Плагин help:effective-settings показывает итоговую конфигурацию settings.xml:mvn help:effective-settings
Плагин help:effective-pom показывает объединенную модель POM с учетом активных профилей:mvn help:effective-pom
#Java #middle #Maven #Profiles #Settings #m2
👍2
Что выведет код?
#Tasks
public class Task070725 {
public static void main(String[] args) {
String[] arr1 = {"A", "B", "C"};
String[] arr2 = arr1;
arr2[1] = "X";
System.out.println(arr1[1]);
}
}
#Tasks
👍1
👍1
Что такое Deque и в чем его особенности? 🤓
Ответ:
Deque (Double-Ended Queue) — интерфейс, представляющий очередь, в которую можно добавлять и удалять элементы с обоих концов.
Реализации: ArrayDeque, LinkedList.
Пример:
Deque<String> deque = new ArrayDeque<>();
deque.addFirst("A"); // Добавление в начало
deque.addLast("B"); // Добавление в конец
System.out.println(deque.removeFirst()); // A
Подходит для стеков, очередей и других структур с двусторонним доступом.
#собеседование
Ответ:
Реализации: ArrayDeque, LinkedList.
Пример:
Deque<String> deque = new ArrayDeque<>();
deque.addFirst("A"); // Добавление в начало
deque.addLast("B"); // Добавление в конец
System.out.println(deque.removeFirst()); // A
Подходит для стеков, очередей и других структур с двусторонним доступом.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
"Хороший программист пишет код, который живет дольше его самого."
Андрей Терехов, разработчик российских компиляторов, сказал это в 2005 году на конференции по программированию в Санкт-Петербурге.
Биография
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Терехов, Андрей Николаевич
Андрей Николаевич Терехов (род. 3 сентября 1949) — доктор физико-математических наук, профессор, заведующий кафедрой системного программирования Санкт-Петербургского государственного университета.
👍1
Конвенции именования в Java
1. Что такое конвенции именования в Java?
Конвенции именования — это стандартизированные правила, определяющие стиль и формат имен для идентификаторов в Java-программах. Идентификаторы — это имена классов, методов, полей, переменных, пакетов и других элементов программы. Java следует строгим соглашениям, описанным в официальной документации (например, Oracle’s Java Code Conventions), чтобы обеспечить единообразие и упростить понимание кода.
Зачем нужны конвенции именования?
Читаемость: Понятные имена делают код более интуитивным для разработчиков.
Поддерживаемость: Единый стиль упрощает работу в команде и поддержку кода.
Предсказуемость: Конвенции позволяют быстро понять назначение элемента (например, метод или константа) по его имени.
Интеграция с инструментами: Многие инструменты (например, IDE, линтеры) используют конвенции для анализа и автодополнения кода.
Упрощение рефакторинга: Стандартизированные имена облегчают поиск и замену идентификаторов.
2. Синтаксис конвенций именования
Конвенции именования в Java используют несколько стилей оформления, таких как camelCase, PascalCase и UPPER_SNAKE_CASE, в зависимости от типа идентификатора.
2.1. Основные стили именования
camelCase: Слова соединяются, первое слово начинается с маленькой буквы, каждое последующее — с заглавной (например, calculateTotalPrice).
PascalCase: Слова соединяются, каждое слово начинается с заглавной буквы (например, CustomerService).
UPPER_SNAKE_CASE: Все буквы заглавные, слова разделяются подчеркиваниями (например, MAX_VALUE).
kebab-case: Не используется в Java, но упомянем для полноты — слова разделяются дефисами (например, my-variable). В Java предпочтение отдается подчеркиваниям для констант.
2.2. Правила для идентификаторов
Идентификаторы могут содержать буквы, цифры, подчеркивания (_) и знак доллара ($).
Идентификаторы не могут начинаться с цифры.
Идентификаторы не могут быть ключевыми словами Java (например, class, int).
Идентификаторы чувствительны к регистру (myVariable и MyVariable — разные идентификаторы).
2.3. Примеры для различных элементов
3. Конвенции для различных элементов программы
3.1. Классы и интерфейсы
Стиль: PascalCase.
Описание: Имена начинаются с заглавной буквы, каждое слово в имени также начинается с заглавной.
Примеры: CustomerService, OrderProcessor, Serializable.
Примечание: Интерфейсы следуют тому же стилю, но их имена часто отражают их назначение (например, Comparable, Runnable).
3.2. Методы
Стиль: camelCase.
Описание: Имена начинаются с маленькой буквы, каждое последующее слово — с заглавной. Имя должно начинаться с глагола, описывающего действие.
Примеры: calculateTotal, getCustomerName, isOrderValid.
Примечание: Для булевых методов часто используют префиксы is или has (например, isActive, hasPermission).
3.3. Поля и переменные
Стиль: camelCase.
Описание: Имена начинаются с маленькой буквы, каждое последующее слово — с заглавной. Имена должны быть описательными.
Примеры: customerId, orderDate, totalAmount.
Примечание: Избегайте однобуквенных имен (например, x, y), кроме случаев, когда они очевидны (например, i в циклах).
3.4. Константы
Стиль: UPPER_SNAKE_CASE.
Описание: Все буквы заглавные, слова разделяются подчеркиваниями. Используется для static final полей.
Примеры: MAX_VALUE, DEFAULT_TIMEOUT, PI.
Примечание: Константы должны быть неизменяемыми и описывать фиксированные значения.
#Java #для_новичков #beginner #java_syntax #Conventions
1. Что такое конвенции именования в Java?
Конвенции именования — это стандартизированные правила, определяющие стиль и формат имен для идентификаторов в Java-программах. Идентификаторы — это имена классов, методов, полей, переменных, пакетов и других элементов программы. Java следует строгим соглашениям, описанным в официальной документации (например, Oracle’s Java Code Conventions), чтобы обеспечить единообразие и упростить понимание кода.
Зачем нужны конвенции именования?
Читаемость: Понятные имена делают код более интуитивным для разработчиков.
Поддерживаемость: Единый стиль упрощает работу в команде и поддержку кода.
Предсказуемость: Конвенции позволяют быстро понять назначение элемента (например, метод или константа) по его имени.
Интеграция с инструментами: Многие инструменты (например, IDE, линтеры) используют конвенции для анализа и автодополнения кода.
Упрощение рефакторинга: Стандартизированные имена облегчают поиск и замену идентификаторов.
2. Синтаксис конвенций именования
Конвенции именования в Java используют несколько стилей оформления, таких как camelCase, PascalCase и UPPER_SNAKE_CASE, в зависимости от типа идентификатора.
2.1. Основные стили именования
camelCase: Слова соединяются, первое слово начинается с маленькой буквы, каждое последующее — с заглавной (например, calculateTotalPrice).
PascalCase: Слова соединяются, каждое слово начинается с заглавной буквы (например, CustomerService).
UPPER_SNAKE_CASE: Все буквы заглавные, слова разделяются подчеркиваниями (например, MAX_VALUE).
kebab-case: Не используется в Java, но упомянем для полноты — слова разделяются дефисами (например, my-variable). В Java предпочтение отдается подчеркиваниям для констант.
2.2. Правила для идентификаторов
Идентификаторы могут содержать буквы, цифры, подчеркивания (_) и знак доллара ($).
Идентификаторы не могут начинаться с цифры.
Идентификаторы не могут быть ключевыми словами Java (например, class, int).
Идентификаторы чувствительны к регистру (myVariable и MyVariable — разные идентификаторы).
2.3. Примеры для различных элементов
// Классы и интерфейсы (PascalCase)
public class CustomerService {
// Поля и переменные (camelCase)
private String customerName;
private int orderCount;
// Константы (UPPER_SNAKE_CASE)
public static final int MAX_ORDERS = 100;
// Методы (camelCase)
public void calculateTotalPrice() {
// Локальные переменные (camelCase)
int totalPrice = 0;
}
// Пакеты (все строчные, слова разделяются точками)
package com.example.myapp;
}
3. Конвенции для различных элементов программы
3.1. Классы и интерфейсы
Стиль: PascalCase.
Описание: Имена начинаются с заглавной буквы, каждое слово в имени также начинается с заглавной.
Примеры: CustomerService, OrderProcessor, Serializable.
Примечание: Интерфейсы следуют тому же стилю, но их имена часто отражают их назначение (например, Comparable, Runnable).
3.2. Методы
Стиль: camelCase.
Описание: Имена начинаются с маленькой буквы, каждое последующее слово — с заглавной. Имя должно начинаться с глагола, описывающего действие.
Примеры: calculateTotal, getCustomerName, isOrderValid.
Примечание: Для булевых методов часто используют префиксы is или has (например, isActive, hasPermission).
3.3. Поля и переменные
Стиль: camelCase.
Описание: Имена начинаются с маленькой буквы, каждое последующее слово — с заглавной. Имена должны быть описательными.
Примеры: customerId, orderDate, totalAmount.
Примечание: Избегайте однобуквенных имен (например, x, y), кроме случаев, когда они очевидны (например, i в циклах).
3.4. Константы
Стиль: UPPER_SNAKE_CASE.
Описание: Все буквы заглавные, слова разделяются подчеркиваниями. Используется для static final полей.
Примеры: MAX_VALUE, DEFAULT_TIMEOUT, PI.
Примечание: Константы должны быть неизменяемыми и описывать фиксированные значения.
#Java #для_новичков #beginner #java_syntax #Conventions
3.5. Пакеты
Стиль: Все строчные буквы, слова разделяются точками.
Описание: Имена пакетов обычно используют обратную доменную нотацию для уникальности.
Примеры: com.example.myapp, org.apache.commons.
Примечание: Избегайте подчеркиваний и дефисов в именах пакетов.
3.6. Локальные переменные и параметры
Стиль: camelCase.
Описание: Аналогично полям, имена должны быть описательными, но могут быть короче, если контекст ясен.
Примеры: index, userInput, result.
4. Правильное применение конвенций именования
Правильное использование конвенций именования критически важно для создания качественного кода.
4.1. Описательность
Имена должны четко отражать назначение элемента. Например, вместо data используйте customerData или orderDetails.
Для методов используйте глаголы, описывающие действие: calculateTotal вместо total, validateInput вместо check.
Пример:
4.2. Согласованность
Следуйте одному стилю именования во всем проекте. Например, если вы используете getName для геттеров, не используйте fetchName в других местах.
Согласованность упрощает поиск и понимание кода в больших проектах.
4.3. Избегайте сокращений
Используйте полные слова вместо сокращений, чтобы избежать двусмысленности. Например, computeAverage лучше, чем compAvg.
Исключение: общепринятые сокращения, такие как max, min, id.
Геттеры и сеттеры: Следуйте конвенции get и set для методов доступа (например, getName, setName).
Булевы методы: Используйте префиксы is или has для методов, возвращающих boolean (например, isEmpty, hasAccess).
4.4. Контекстная ясность
Имена должны быть понятны в контексте класса. Например, в классе Order метод calculateTotal не нуждается в уточнении Order (в отличие от calculateOrderTotal).
4.5. Избегайте избыточности
Не добавляйте лишние слова, если они не уточняют смысл. Например, calculateTotal лучше, чем doCalculateTotal.
Пример:
5. Назначение конвенций именования
Конвенции именования выполняют несколько важных функций:
5.1. Улучшение читаемости
Хорошо названные идентификаторы позволяют разработчикам мгновенно понять назначение класса, метода или переменной.
Например, имя CustomerService сразу указывает на класс, связанный с обслуживанием клиентов.
5.2. Упрощение командной работы
Единые правила именования позволяют разработчикам из разных команд понимать код друг друга.
Это особенно важно в больших проектах или open-source сообществах.
5.3. Поддержка инструментов
Современные IDE (например, IntelliJ IDEA, Eclipse) используют конвенции для автодополнения, рефакторинга и анализа кода. Например, метод getName автоматически распознается как геттер.
Линтеры и статические анализаторы (например, Checkstyle) проверяют соблюдение конвенций.
5.4. Предотвращение ошибок
Правильные имена уменьшают вероятность ошибок. Например, имя MAX_RETRIES для константы ясно указывает на ее неизменяемость, а calculateTotal для метода — на его назначение.
5.5. Документация и самодокументирующийся код
Хорошо названные идентификаторы делают код самодокументирующимся, уменьшая необходимость в избыточных комментариях.
Например, вместо комментария // Вычисляет сумму цен можно просто использовать имя calculateTotalPrice.
#Java #для_новичков #beginner #java_syntax #Conventions
Стиль: Все строчные буквы, слова разделяются точками.
Описание: Имена пакетов обычно используют обратную доменную нотацию для уникальности.
Примеры: com.example.myapp, org.apache.commons.
Примечание: Избегайте подчеркиваний и дефисов в именах пакетов.
3.6. Локальные переменные и параметры
Стиль: camelCase.
Описание: Аналогично полям, имена должны быть описательными, но могут быть короче, если контекст ясен.
Примеры: index, userInput, result.
4. Правильное применение конвенций именования
Правильное использование конвенций именования критически важно для создания качественного кода.
4.1. Описательность
Имена должны четко отражать назначение элемента. Например, вместо data используйте customerData или orderDetails.
Для методов используйте глаголы, описывающие действие: calculateTotal вместо total, validateInput вместо check.
Пример:
// Хорошо
int calculateOrderTotal(Order order) {
return order.getItems().stream().mapToInt(Item::getPrice).sum();
}
// Плохо
int calc(Order o) {
return o.getItems().stream().mapToInt(Item::getPrice).sum();
}
4.2. Согласованность
Следуйте одному стилю именования во всем проекте. Например, если вы используете getName для геттеров, не используйте fetchName в других местах.
Согласованность упрощает поиск и понимание кода в больших проектах.
4.3. Избегайте сокращений
Используйте полные слова вместо сокращений, чтобы избежать двусмысленности. Например, computeAverage лучше, чем compAvg.
Исключение: общепринятые сокращения, такие как max, min, id.
Геттеры и сеттеры: Следуйте конвенции get и set для методов доступа (например, getName, setName).
Булевы методы: Используйте префиксы is или has для методов, возвращающих boolean (например, isEmpty, hasAccess).
4.4. Контекстная ясность
Имена должны быть понятны в контексте класса. Например, в классе Order метод calculateTotal не нуждается в уточнении Order (в отличие от calculateOrderTotal).
4.5. Избегайте избыточности
Не добавляйте лишние слова, если они не уточняют смысл. Например, calculateTotal лучше, чем doCalculateTotal.
Пример:
class Order {
// Хорошо
public double calculateTotal() {
return items.stream().mapToDouble(Item::getPrice).sum();
}
// Плохо
public double doCalculateTotalOfOrder() {
return items.stream().mapToDouble(Item::getPrice).sum();
}
}
5. Назначение конвенций именования
Конвенции именования выполняют несколько важных функций:
5.1. Улучшение читаемости
Хорошо названные идентификаторы позволяют разработчикам мгновенно понять назначение класса, метода или переменной.
Например, имя CustomerService сразу указывает на класс, связанный с обслуживанием клиентов.
5.2. Упрощение командной работы
Единые правила именования позволяют разработчикам из разных команд понимать код друг друга.
Это особенно важно в больших проектах или open-source сообществах.
5.3. Поддержка инструментов
Современные IDE (например, IntelliJ IDEA, Eclipse) используют конвенции для автодополнения, рефакторинга и анализа кода. Например, метод getName автоматически распознается как геттер.
Линтеры и статические анализаторы (например, Checkstyle) проверяют соблюдение конвенций.
5.4. Предотвращение ошибок
Правильные имена уменьшают вероятность ошибок. Например, имя MAX_RETRIES для константы ясно указывает на ее неизменяемость, а calculateTotal для метода — на его назначение.
5.5. Документация и самодокументирующийся код
Хорошо названные идентификаторы делают код самодокументирующимся, уменьшая необходимость в избыточных комментариях.
Например, вместо комментария // Вычисляет сумму цен можно просто использовать имя calculateTotalPrice.
#Java #для_новичков #beginner #java_syntax #Conventions
6. Конвенции именования и работа под капотом
Понимание того, как имена идентификаторов обрабатываются в JVM, помогает оценить их влияние на производительность и структуру программы.
6.1. Хранение идентификаторов в памяти
Идентификаторы (имена классов, методов, полей) хранятся в Metaspace как часть метаданных класса. Они представляют собой строки, которые компилируются в байт-код и загружаются в JVM при загрузке класса.
Длина имени идентификатора не влияет на размер объекта в куче (Heap), так как имена хранятся отдельно в Metaspace. Однако длинные имена могут незначительно увеличить объем метаданных.
6.2. Влияние на байт-код
В байт-коде идентификаторы преобразуются в ссылки на строки в пуле констант (constant pool) класса. Это позволяет JVM эффективно работать с именами, минимизируя их влияние на производительность.
JVM не различает стили именования (camelCase, PascalCase и т.д.), так как они являются лишь соглашениями для разработчиков. Однако несоблюдение конвенций может запутать инструменты анализа кода.
6.3. Рефлексия и имена
Рефлексия в Java (например, через Class.getMethod) использует имена методов и полей. Правильные имена (например, getName) позволяют рефлексии точно находить нужные элементы.
Неправильные имена (например, name вместо getName для геттера) могут привести к ошибкам при использовании рефлексии в фреймворках, таких как Spring или Hibernate.
Пример:
6.4. Оптимизация и производительность
Длина имени: Хотя длинные имена увеличивают объем метаданных в Metaspace, их влияние на производительность минимально благодаря оптимизациям JVM, таким как интернирование строк.
Читаемость vs. производительность: Длинные, но описательные имена (например, calculateTotalOrderPrice) предпочтительнее коротких и неясных (например, calc), так как читаемость важнее незначительных затрат памяти.
Инструменты минимизации: При использовании инструментов, таких как ProGuard, имена могут быть обфусцированы (сокращены) для уменьшения размера байт-кода, но это не влияет на исходный код.
6.5. Утечки памяти и имена
Неправильные имена не напрямую вызывают утечки памяти, но они могут привести к ошибкам, которые косвенно влияют на память. Например, если метод с именем clear не очищает ресурсы, а разработчик предполагает обратное, это может привести к удержанию объектов в куче.
Четкие имена, такие как releaseResources, помогают избежать таких недоразумений.
7. Лучшие практики
Следуйте официальным конвенциям: Используйте рекомендации Oracle’s Java Code Conventions для обеспечения совместимости с другими проектами.
Будьте описательны, но лаконичны: Имена должны быть понятными, но не избыточно длинными (например, getCustomerName лучше, чем getTheNameOfTheCustomer).
Используйте глаголы для методов: Методы должны начинаться с глагола, описывающего действие (например, calculate, get, set).
Избегайте неоднозначности: Не используйте имена, которые могут быть поняты неправильно (например, process может означать слишком многое).
Документируйте через имена: Делайте код самодокументирующимся, используя понятные имена вместо избыточных комментариев.
Проверяйте с помощью линтеров: Используйте инструменты, такие как Checkstyle, для автоматической проверки соблюдения конвенций.
Пример самодокументирующегося кода:
#Java #для_новичков #beginner #java_syntax #Conventions
Понимание того, как имена идентификаторов обрабатываются в JVM, помогает оценить их влияние на производительность и структуру программы.
6.1. Хранение идентификаторов в памяти
Идентификаторы (имена классов, методов, полей) хранятся в Metaspace как часть метаданных класса. Они представляют собой строки, которые компилируются в байт-код и загружаются в JVM при загрузке класса.
Длина имени идентификатора не влияет на размер объекта в куче (Heap), так как имена хранятся отдельно в Metaspace. Однако длинные имена могут незначительно увеличить объем метаданных.
6.2. Влияние на байт-код
В байт-коде идентификаторы преобразуются в ссылки на строки в пуле констант (constant pool) класса. Это позволяет JVM эффективно работать с именами, минимизируя их влияние на производительность.
JVM не различает стили именования (camelCase, PascalCase и т.д.), так как они являются лишь соглашениями для разработчиков. Однако несоблюдение конвенций может запутать инструменты анализа кода.
6.3. Рефлексия и имена
Рефлексия в Java (например, через Class.getMethod) использует имена методов и полей. Правильные имена (например, getName) позволяют рефлексии точно находить нужные элементы.
Неправильные имена (например, name вместо getName для геттера) могут привести к ошибкам при использовании рефлексии в фреймворках, таких как Spring или Hibernate.
Пример:
import java.lang.reflect.Method;
class Example {
public String getName() {
return "Test";
}
}
class ReflectionTest {
public static void main(String[] args) throws Exception {
Method method = Example.class.getMethod("getName"); // Работает
// Method method = Example.class.getMethod("name"); // Ошибка, если метод не существует
}
}
6.4. Оптимизация и производительность
Длина имени: Хотя длинные имена увеличивают объем метаданных в Metaspace, их влияние на производительность минимально благодаря оптимизациям JVM, таким как интернирование строк.
Читаемость vs. производительность: Длинные, но описательные имена (например, calculateTotalOrderPrice) предпочтительнее коротких и неясных (например, calc), так как читаемость важнее незначительных затрат памяти.
Инструменты минимизации: При использовании инструментов, таких как ProGuard, имена могут быть обфусцированы (сокращены) для уменьшения размера байт-кода, но это не влияет на исходный код.
6.5. Утечки памяти и имена
Неправильные имена не напрямую вызывают утечки памяти, но они могут привести к ошибкам, которые косвенно влияют на память. Например, если метод с именем clear не очищает ресурсы, а разработчик предполагает обратное, это может привести к удержанию объектов в куче.
Четкие имена, такие как releaseResources, помогают избежать таких недоразумений.
7. Лучшие практики
Следуйте официальным конвенциям: Используйте рекомендации Oracle’s Java Code Conventions для обеспечения совместимости с другими проектами.
Будьте описательны, но лаконичны: Имена должны быть понятными, но не избыточно длинными (например, getCustomerName лучше, чем getTheNameOfTheCustomer).
Используйте глаголы для методов: Методы должны начинаться с глагола, описывающего действие (например, calculate, get, set).
Избегайте неоднозначности: Не используйте имена, которые могут быть поняты неправильно (например, process может означать слишком многое).
Документируйте через имена: Делайте код самодокументирующимся, используя понятные имена вместо избыточных комментариев.
Проверяйте с помощью линтеров: Используйте инструменты, такие как Checkstyle, для автоматической проверки соблюдения конвенций.
Пример самодокументирующегося кода:
class OrderProcessor {
// Хорошо: имя метода понятно без комментариев
public double calculateTotalPrice(List<Item> items) {
return items.stream().mapToDouble(Item::getPrice).sum();
}
}
#Java #для_новичков #beginner #java_syntax #Conventions
Что выведет код?
#Tasks
public class Task080725 {
public static void main(String[] args) {
int String = 10;
System.out.println(String);
}
}
#Tasks