Что будет выведено в консоль?
Anonymous Quiz
11%
java.lang.String model
18%
Exception: class Main cannot access a member of class Car with modifiers "private"
61%
BMW
10%
car.Model
#patterns
Паттерн Стратегия
Начнем с проблемы, которую решает данный паттерн. Сразу же приведем пример.
У нас есть класс Navigator (#1), в котором мы в зависимости от типа передвижения прокладывает маршрут от точки A в точку B.
Все, в принципе, работает. Но проблемы начинаются при расширении типов передвижения. Если пользователь теперь хочет чтобы ему прокладывался маршрут когда он на машине, мы должны лезть в наш исходный класс, и вручную это все прописывать. Также, мы нарушаем один из принципов SOLID, что класс должен быть закрыт для изменения, но открыт для расширения.
Решение. Вместо кучи if 'ов, мы создадим интерфейс (#2), который сможет принимать любые типы передвижения.
Теперь, наш класс мы не трогаем. Мы создали интерфейс с методом который строит маршрут. И создали пару классов, которые реализуют этот метод по своему. В общем, теперь мы можем создать хоть тысячу классов с типами передвижения, благодаря которым сможет строить маршрут так, как это надо, не изменяя базовый класс, а только расширяя его "возможности".
Паттерн Стратегия
Начнем с проблемы, которую решает данный паттерн. Сразу же приведем пример.
У нас есть класс Navigator (#1), в котором мы в зависимости от типа передвижения прокладывает маршрут от точки A в точку B.
Все, в принципе, работает. Но проблемы начинаются при расширении типов передвижения. Если пользователь теперь хочет чтобы ему прокладывался маршрут когда он на машине, мы должны лезть в наш исходный класс, и вручную это все прописывать. Также, мы нарушаем один из принципов SOLID, что класс должен быть закрыт для изменения, но открыт для расширения.
Решение. Вместо кучи if 'ов, мы создадим интерфейс (#2), который сможет принимать любые типы передвижения.
Теперь, наш класс мы не трогаем. Мы создали интерфейс с методом который строит маршрут. И создали пару классов, которые реализуют этот метод по своему. В общем, теперь мы можем создать хоть тысячу классов с типами передвижения, благодаря которым сможет строить маршрут так, как это надо, не изменяя базовый класс, а только расширяя его "возможности".
(Код не является идеальным примером реализации этого паттерна, он просто кое-как отображает его суть)
#java
Кастинг ссылочных типов данных
Кастинг - это процесс, когда вы заставляете переменную одного типа данных вести себя как переменная другого типа данных.
Кастинг возможен только тогда, когда между классами/интерфейсами существует IS-A взаимоотношение.
Делая кастинг, вы не меняете тип данных объекта, а заставляете его чувствовать себя как объект другого типа.
Кастинг из дочернего класса в супер класс происходит автоматически - Upcasting.
Кастинг из супер класса в дочерний класс НЕ происходит автоматически - Downcasting.
Если между классами/интерфейсами нет IS-A взаимоотношения, компилятор не допустит кастинг.
Даже если компилятор допустил кастинг, выскочит runtime exception, если объект, который мы делаем каст на самом деле не принадлежит классу, на который мы его делаем каст.
Кастинг ссылочных типов данных
Кастинг - это процесс, когда вы заставляете переменную одного типа данных вести себя как переменная другого типа данных.
Кастинг возможен только тогда, когда между классами/интерфейсами существует IS-A взаимоотношение.
Делая кастинг, вы не меняете тип данных объекта, а заставляете его чувствовать себя как объект другого типа.
Кастинг из дочернего класса в супер класс происходит автоматически - Upcasting.
Кастинг из супер класса в дочерний класс НЕ происходит автоматически - Downcasting.
Если между классами/интерфейсами нет IS-A взаимоотношения, компилятор не допустит кастинг.
Даже если компилятор допустил кастинг, выскочит runtime exception, если объект, который мы делаем каст на самом деле не принадлежит классу, на который мы его делаем каст.
#java
О методе equals()
Если вы перезаписываете метод equals, всегда используйте в его параметре тип данных Object.
Правильно перезаписанный метод equals должен обладать следующими свойствами:
О методе equals()
Если вы перезаписываете метод equals, всегда используйте в его параметре тип данных Object.
Правильно перезаписанный метод equals должен обладать следующими свойствами:
⟡
Симметричность - для non-null ссылочных переменных a и b, a.equals(b) возвращает true тогда и только тогда, когда b.equals(a) возвращает true.⟡
Рефлексивность - для non-null ссылочных типов переменной a, a.equals(a) всегда должно возвращать true.⟡
Транзитивность - для non-null ссылочных переменных a, b, c если a.equals(b) и b.equals(c) возвращает true, то a.equals(c) тоже должно возвращать true.⟡
Постоянство - для non-null ccылочных переменных переменных a и b, неоднократный вызов a.equals(b) должен возвращать или только true или только false.⟡
Для non-null ссылочной переменной a, a.equals(null) всегда должно возвращать false.#java
Non-access modifiers
Non-access modifiers
⟡
transient. Переменные класса с ключевым словом transient не сериализуются.⟡
native. Методы с ключевым словом native реализованы не на Java. В своем описании они не имеют тела и заканчиваются как абстрактные методы символом ";".⟡
synchronized. Методы с ключевым словом synchronized могут быть использованы в одно и тоже время только одним потоком.⟡
volatile. Переменные с ключевым словом volatile могут быть изменены разными потоками и данные изменения будут видны во всех потоках.⟡
strictfp. Ключевое слово strictfp в методах и классах ограничивает точность вычислений с float и double по стандарту IEEE.Что будет выведено в консоль?
Anonymous Quiz
25%
BACBAC
37%
ABCABC
28%
BACAC
5%
ACBAB
2%
BACCAB
5%
BACBA
#java
Checked/Unchecked exceptions
Runtime исключения бывают в коде, в котором присутствуют ошибочные выражения. Т.е. в выбросе данных исключений виноват программист. Компилятор НЕ в состоянии проверить возможность выброса runtime исключений.
❗️Runtime исключения можно не объявлять и не обрабатывать, но при желании, можно сделать и то, и другое.
Checked исключения указывают на часть кода, которая находится за пределами непосредственного контроля программой и которая может являться причиной выброса исключений. Они, как правило, возникают при взаимодействии вашей программы с внешними источниками (работа с файлами, с БД, с сетью), из-за которых могут возникать проблемы. Компилятор всегда проверяет возможность выброса checked исключений.
❗️Checked исключения всегда должны быть или объявлены и/или обработаны.
Checked/Unchecked exceptions
Раньше уже был пост на эту тему, но в этом попытаюсь объяснить более простыми словами + дополнить + повторение материала не помешает)
⟡
Сабклассы RuntimeExceptions = unchecked exceptionsRuntime исключения бывают в коде, в котором присутствуют ошибочные выражения. Т.е. в выбросе данных исключений виноват программист. Компилятор НЕ в состоянии проверить возможность выброса runtime исключений.
❗️Runtime исключения можно не объявлять и не обрабатывать, но при желании, можно сделать и то, и другое.
⟡
Сабклассы Exceptions = checked exceptionsChecked исключения указывают на часть кода, которая находится за пределами непосредственного контроля программой и которая может являться причиной выброса исключений. Они, как правило, возникают при взаимодействии вашей программы с внешними источниками (работа с файлами, с БД, с сетью), из-за которых могут возникать проблемы. Компилятор всегда проверяет возможность выброса checked исключений.
❗️Checked исключения всегда должны быть или объявлены и/или обработаны.
(продолжение пред. поста)
Если метод a использует внутри себя метод b, который может выбросить checked исключение, то метод a должен:
1. Или заключить вызов метода b в try/catch блоки
2. Или/и объявить, что он тоже может выбросить это checked исключение или его super класс.
Error - это очень серьезные ошибки, который не могут быть напрямую контролированы вашей программой.
Error'ы могут быть объявлены, но объявлять error'ы считается глупой практикой. Некоторые error'ы могут быть обработаны, но это тоже будет очень глупой затеей. Error'ы, как и runtime исключения считаются unchecked.
⟡
Checked exceptionsЕсли метод a использует внутри себя метод b, который может выбросить checked исключение, то метод a должен:
1. Или заключить вызов метода b в try/catch блоки
2. Или/и объявить, что он тоже может выбросить это checked исключение или его super класс.
⟡
ErrorError - это очень серьезные ошибки, который не могут быть напрямую контролированы вашей программой.
Error'ы могут быть объявлены, но объявлять error'ы считается глупой практикой. Некоторые error'ы могут быть обработаны, но это тоже будет очень глупой затеей. Error'ы, как и runtime исключения считаются unchecked.
#java
Важные моменты в исключениях
Важные моменты в исключениях
⟡
Очередность catch блоков очень важна. Компилятор не пропустит код, если исключение "супер класс" будет стоять перед исключением "дочерний класс".⟡
Если в части кода, которая не находится в блоке try или в блоке try выбрасывается исключение, то соответствующая оставшаяся часть кода уже не обрабатывается.⟡
После выброса исключения мы можем увидеть стэк трейс (1) для всех методов, задействованных в выбросе этого исключения.⟡
При создании объекта исключения вы можете воспользоваться его конструктором, который принимает String параметр и вписать в него необходимую информацию. Вы также можете воспользоваться конструктором, который не принимает параметры.⟡
finally блок выполняется в том случае, если в try блоке или в catch блоке имеется return statement.⟡
finally блок не выполнится только в том случае, если вы прекращаете работу программы с помощью System.exit в try или в catch блоке или же, если происходит "крушение" JVM или, например, операционной системы.⟡
Если return statement имеется и в catch блоке и в finally блоке, то аутпутом метода будет возвращаемое значение из finally блока.(1) Про это позже будет пост
#java
Лямбда выражения
( Поскольку пост вышел довольно объемным, сделал его в телеграфе. Удобная штука оказалась )
https://telegra.ph/Lyambda-vyrazheniya-06-06
Лямбда выражения
( Поскольку пост вышел довольно объемным, сделал его в телеграфе. Удобная штука оказалась )
https://telegra.ph/Lyambda-vyrazheniya-06-06
Telegraph
Лямбда выражения
Как всегда, начнем с неудобств, которые решают лямбды) Имеется обычный класс, Employee. Поля - имя, департамент, ЗП. Есть задача - отфильтровать сотрудников. Если бы фильтрация была одноразовой, за каким-то одним параметром, проблем бы не было. Но, фильтровать…
#java
Встроенные функциональные интерфейсы
Решил написать сначала о функциональных интерфейсах, все-таки, это база для StreamAPI. Кстати, следующий пост будет о именно о них.
https://telegra.ph/Vstroennye-funkcionalnye-interfejsy-06-11
Встроенные функциональные интерфейсы
Решил написать сначала о функциональных интерфейсах, все-таки, это база для StreamAPI. Кстати, следующий пост будет о именно о них.
https://telegra.ph/Vstroennye-funkcionalnye-interfejsy-06-11
Telegraph
Встроенные функциональные интерфейсы
Как и упоминалось в предыдущем посте, разработчики Java создали довольно много функциональных интерфейсов. Рассмотрим основные.