Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк
🔥Тот самый курс по многопочке🔥
https://fillthegaps.ru/mt
Комплименты, вопросы, предложения: @utki_letyat
Post #341
4.93K
JA @java_fillthegaps
Showing posts older than #342 · Back to latest
A service1 = new A();Для наблюдателя service1 и service2 ведут себя совершенно одинаково. Класс-наследник дополняет поведение родителя, а не замещает его. В результате система работает более предсказуемо.
A service2 = new B();
Info getInfo()
Наследник:✅ BigInfo getInfo()2️⃣ Подклассы не бросают дополнительных исключений, но могут уменьшить их список
❌ Object getInfo()
void save() throws FileNotFoundException
Наследник:✅ void save()Java — типизированный язык, поэтому пункты 1 и 2 контролируются компилятором.
❌ void save() throws FileNotFoundEx, InterruptedEx
void add(Account acc)
Наследник:✅ void add(Object acc)Следующие пункты компилятор уже не проверит, это целиком ответственность программиста.
❌ void add(AdminAccount acc)
countVisitors считает пользователей
Ctrl + Cработают со всей строкой, на которой стоит курсор, не нужно ничего выделять.
Ctrl + V
Ctrl + X
Ctrl + YДублировать строку:
Ctrl + DВыделить часть кода:
Ctrl + WПри каждом нажатии W захватывается всё большая область.
Ctrl + Shift + ⬆️
Ctrl + Shift + ⬇️@Before и @After.Runner или абстрактного класса, в нужных местах добавляем нужные действия. Теперь тесты запускаются не по стандартной схеме, а по той, что прописана в новом классе.@RunWith(Parameterized.class) запускает параметризованные тесты@RunWith(Suite.class) запускает наборы тестов@RunWith(SpringJUnit4ClassRunner.class) добавляет спринговые активности до и после запуска теста@RunWith(MockitoJUnitRunner.class) позволяет использовать заглушкиRunner для теста может быть только один. Не получится совместить несколько фич, например, параметризованные тесты с заглушками.TestRule и задаём действие до и после выполнения теста. В тестах выглядит как просто поле:@RuleВ JUnit 4 есть несколько готовых правил:
public Timeout globalTimeout = Timeout.seconds(10);
TemporaryFolder - создать временную папку для тестаExternalResource - открыть и закрыть внешний ресурс(файл, сокет, БД)▫️BeforeAllCallback - действие перед всеми тестами▫️ParameterResolver - передача параметров в тестRunner и Rule, всё переписано на Extension API. Кодовые базы стали несовместимы между собой, поэтому и нужна библиотека Vintage с адаптерами.@Test, @Before, методы assertEquals и тд. Здесь всё классно. @Test. @DisplayName задаётся симпатичное имя теста в отчёте.▫️ @Before, @BeforeAllJUnit создаёт новый экземпляр класса на каждый тестовый метод. Класс
▫️ @After, @AfterAll
ServiceTest с пятью методами @Test во время запуска превратится в 5 экземпляров класса ServiceTest.@TestInstance(Lifecycle.PER_CLASS)
2️⃣ Проверки🔸 assertTrueВ самом JUnit мало методов, более удобные ассерты есть в библиотеках Hamсrest и AssertJ. AssertJ, на мой взгляд, более читабельный, но Hamсrest используется чаще.
🔸 assertEquals
🔸 assertInstanceOf
@Tag("groupName") объединяет тесты в группы. Работает и для одного теста, и для класса.@Disabled. Продвинутые варианты для: @DisabledOnOs(WINDOWS)▫️ версии java
@DisabledOnJre(JAVA_9)▫️ системных переменных:
@DisabledForJreRange(min = JAVA_9)
@DisabledIfSystemProperty(named = "ci-server", matches = "true")5️⃣ Параметризированные тесты
@DisabledIfEnvironmentVariable(named = "ENV", matches = ".*development.*")
@ParameterizedTestТакой тест запустится дважды - с аргументом 100 и -14.
@ValueSource(ints={100,-14})
public void test(int input) {}
@CsvSource
🔸 из метода @MethodSource
6️⃣ Проверка таймаутаassertTimeout(ofMinutes(2), ()->{});
▫️ Через аннотацию@Timeout(value=42,unit=SECONDS)7️⃣ Полезные библиотеки
@ExtendWith(MockitoExtension.class)
▫️ Testcontainers для запуска внешних компонентов в докере. Добавляем библиотеку, аннотацию @Testcontainers над классом и @Container над компонентомString s = s1 + s2 + s3;Для него компилятор java 8 соберёт байткод:
// Method StringBuilder."(init)":()Компилятор java 9 сделает по-другому:
// Method StringBuilder.append:(String)
// Method StringBuilder.append:(String)
// Method StringBuilder.append:(String)
// Method StringBuilder.toString:()
invokedynamic #13По ссылкам мы придём в метод StringConcatFactory#makeConcatWithConstants
"a"+"b", то проблемы нет. "a"+"b"+"c"+"d" приведёт к созданию ab, abc и abcd.StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
sb.append("c");
String res = sb.toString();
Что происходит: StringBuilder выделяет байтовый массив и с каждым append добавляет туда строчки. При вызове toString из этого массива создаётся неизменяемая строка. Так количество лишних объектов существенно сокращается.String s = "a" + "b" + "c";
Сразу компилируется в abc.final String s1 = "a";
final String s2 = "b";
final String s3 = "с";
String s4 = s1 + s2 + s3;
Это тоже компилируется в abc, без промежуточных объектов."a"+"b"+"c" приводит к созданию объектов ab и abc. Многие понимают это буквально, что это оператор + приводит к созданию лишних объектов. Поэтому лучше плюсик не использовать, а использовать StringBuilder.String s1 = "b";
String s2 = "с";
String s3 = s1 + s2;
В данном случае это не рационально.String s3 = s1.concat(s2);
Итого, как соединить две строки: