Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк
🔥Тот самый курс по многопочке🔥
https://fillthegaps.ru/mt
Комплименты, вопросы, предложения: @utki_letyat
Post #295
4.11K
JA @java_fillthegaps
Showing posts older than #296 · Back to latest
String src = …src равен null, то
String x = src ?: "default";
▫️Если
x = "default"
▫️Если src НЕ равен null, то x = src
По сути это сокращённая форма тернарного оператора:String x = src==null ? src : "default"Есть два оператора, которые похожи на элвис:
str?.toString()= если
str не равен null, то вызвать метод toString()
🔸 ?[] — null-safe array access lines?[6]= если массив
lines существует, то прочитать 6 элементString aMember = g?.members?[0]?.name ?: "nobody";Но элвис оператор это только ?:
var str: String? = "abc"Все null значения под чётким контролем. Поэтому элвис оператор не скрывает ошибок, а помогает писать лаконичный код. Захотели nullability — чётко это обозначили. Хотим избавиться от этого свойства — используем элвис оператор.
Ctrl+C и Ctrl+V, а настоящие шоумены - мультикаретки.🔸 ArrayBlockingQueueВ этом посте кратко расскажу, чем они отличаются и как выбрать подходящую.
🔸 LinkedBlockingQueue
🔸 ConcurrentLinkedQueue
return m > 10;Написали для него тесты:
m = 0, ожидаем falsem = 100, ожидаем truem ≥ 10, и ни один тест не упадёт. Значит, текущих тестов недостаточно, нужно проверить условие m = 10
ПрактикаParent[] arr;🔸 Присваиваем массив Child:
arr = new Child[2];🔸 Добавляем в arr экземпляры Child и Parent:
arr[0] = new Child();Вторая строка в рантайме бросит ArrayStoreException. Дженерики обрабатываются при компиляции, поэтому ошибок на этапе выполнения нет.
arr[1] = new Parent();
void print(List<? extends Parent> list)Теперь метод принимает только List<Parent> и List<Child>, плюс есть доступ к методам Parent. Но менять список всё ещё нельзя.
▫️ <T extends Parent> void test(List<T> list)Чем они отличаются?
▫️ void test(List<? extends Parent> list)
? extends Parent: допустимы Parent, Child и наследники Child? super Parent принимает Parent и родителей Parent вплоть до Object
List values = new ArrayList()Чтобы нормально работать, приходилось использовать явное приведение:
values.add("value");
String s = (String) values.get(0);
Главная проблема с коллекциями тех лет - type loss, потеря типа при компиляции и написании кода:List<String> values = new ArrayList<String>();✅ Удобно пользоваться
values.add("p");
String v = values.get(0);
void add(String str)В итоге создаём отдельный класс для каждого типа данных.
String get(int index)
String value = list.get(0)Компилятор преобразует это в
String value = (String) list.get(0);🤔Все варианты адекватные и имеют право на жизнь. Что же выбрать?
public void do() {
File f=new File("t.txt");
// Создаём объект File, ресурс "t.txt" теперь наш
// что-то делаем
}
// вышли из метода: объект f уже не нужен, ресурс "t.txt" освобождается
RAII легко реализовать в С++. В конструкторе пишем логику "открытия" ресурса, а в деструкторе - "закрытия". Конструктор и деструктор явно прописываются, поэтому ЖЦ объекта и ресурса под контролем.try (PrintWriter writer = new PrintWriter(…)) {
// что-то делаем
}
Ресурс реализует интерфейс AutoCloseable, и после завершения блока для него вызовется close(). try-with-resources считается java реализацией RAII.try (DatagramChannel udpServer = …;В java 9 в блок try можно передать переменные:
Selector selector = …) {
// …
}
DatagramChannel udpServer = …;С одной стороны это удобно. Код выглядит приятно.
Selector selector = …;
try (udpServer;selector) {
// …
}