Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк
🔥Тот самый курс по многопочке🔥
https://fillthegaps.ru/mt
Комплименты, вопросы, предложения: @utki_letyat
Post #245
3.57K
JA @java_fillthegaps
Showing posts older than #246 · Back to latest
GET /stat, который считает статистику. Для подсчёта используется внутренняя информация сервиса А и делается HTTP запрос GET /data в сервис Б.
Phaser хорошо виден разрыв между теорией и практикой. В этом посте расскажу, почему.CountDownLatch
2️⃣ CyclicBarrier
3️⃣ Phaser
Последний - самый продвинутый:Phaser
🔸 Иногда работает быстрее, чем CountDownLatch и CyclicBarrier
🔸 Обработка исключенийPhaser часто встречается на воркшопах и advanced java курсах. Можно долго рассказывать про методы, рисовать схемы и многопоточно перемножать двумерные массивы.Phaser нет шансов. За пределами конференций и статей этот класс не используется. Phaser?CountDownLatch или CyclicBarrier. Phaser неплохо спроектирован, но слишком оторван от практических задач, это наглядный пример over engineering.message OrderRequest {
required int64 user_id = 1;
optional string address= 2;
repeated int64 item_id = 3;
}
Отправитель создаёт массив байтов опираясь на эту схему. Получатель считает данные по той же схеме.private static final long serialVersionUID = 27507467L;В этом посте разберёмся, зачем это нужно, когда прописывать serialVersionUID и когда менять. В конце поговорим про недостатки сериализации в java.
InvalidClassException
Когда serialVersionUID не указан в классе явно, JVM вычисляет его в рантайме на основе имени класса, интерфейсов, полей и методов. Добавили новый метод - serialVersionUID изменился. Поэтому рекомендуется зафиксировать serialVersionUID, даже если поля класса не меняются.class UserRequest implements SerializableУ него нет обязательных методов, это интерфейс-маркер.
private void writeObject(…out) {
out.writeInt(parentValue);
out.writeInt(childValue);
}
В readObject указывается, какие поля и в каком порядке читать из байтового стрима:private void readObject(…in){
int parentValue=in.readInt();
setParentValue(parentValue);
this.childValue=in.readInt();
}
В любом из вариантов десериализованный объект напечатает 4 и 50.
toList()
С 25 по 27 ноября была серия постов о коллекторах (часть 1, часть 2, часть 3). Там я писала, что вместоcollect(Collectors.toList())было бы удобно писать просто
toList()30 ноября разработчик Oracle добавил метод toList() в класс Stream. Вряд ли он читает этот канал, но совпадение интересное🙂
orders.stream()flatMap переводит "список списков" в один список. Товары для каждого заказа превращаются в Stream, а метод flatMap объединяет эти стримы в один.
.flatMap(order->order.getItems().stream())
.toList();
orders.stream()Что происходит:
.<Item>mapMulti((order, consumer) ->
order.getItems().forEach(item -> consumer.accept(item))
).toList();
<Item>mapMulti(…)Когда использовать mapMulti?
.class
Deprecated d = Account.class. getAnnotation(Deprecated.class)🔸 Делаем что-то полезное
@Override, @Deprecated, @SuppressWarnings - вот это всё.public @interface MyAnnotation {}
❓Почему ключевое слово @интерфейс, а не @аннотейшн? @Retention(RUNTIME)На этом примере видно, из чего состоит аннотация:
@Target(value={FIELD,…})
public @interface Deprecated {
String since() default "";
boolean forRemoval() default false;
}
@Deprecated(since="14")// forRemoval по умолчанию false
▫️new @Test Account()
▫️throws @Test IOException
▫️implements @Test Comparable<@Test
T>
Такие аннотации называются type annotations и используются в IDE и компиляторах для анализа и строгого контроля типов.@Test String doubled
❌ String @Test out
🔸@Retention определяет, когда доступна аннотация и как её можно использовать. Все виды подробно рассмотрим во второй части.@Schedule(dayOfMonth="last")Создать аннотацию легко, правильно применить - уже сложнее. С этим вопросом разберёмся во второй части.
@Schedule(dayOfWeek="Fri", hour="23")