Source Code
197 subscribers
30 photos
3 files
80 links
Download Telegram
#java
Абстрактные классы

Абстрактный класс — это класс, в объявлении которого есть ключевое слово abstract. Его отличие от обычного класса в том, что нельзя создать объект или экземпляр данного класса. Все остальное в абстрактном классе остается таким как и в обычном.

Производный класс обязан переопределить и реализовать все абстрактные методы, которые имеются в базовом абстрактном классе. Также следует учитывать, что если класс имеет хотя бы один абстрактный метод, то данный класс должен быть определен как абстрактный.

Зачем нужны абстрактные классы? Допустим, мы делаем программу для обслуживания банковских операций и определяем в ней три класса: Person, который описывает человека, Employee, который описывает банковского служащего, и класс Client, который представляет клиента банка. Очевидно, что классы Employee и Client будут производными от класса Person, так как оба класса имеют некоторые общие поля и методы. И так как все объекты будут представлять либо сотрудника, либо клиента банка, то напрямую мы от класса Person создавать объекты не будем. Поэтому имеет смысл сделать его абстрактным.
#java

Почему в Java нет множественного наследования, но реализация нескольких интерфейсов разрешена?

Проблема множественного наследования заключается в том, что два класса могут определять разные способы выполнения одного и того же, и подкласс не может выбрать, какой из них выбрать.

C помощью интерфейса вы описываете то, что может сделать класс, а не заимствуете метод другого класса. Несколько интерфейсов гораздо реже вызывают сложные конфликты, которые необходимо разрешить, чем несколько родительских классов.
#java
Разница между абстрактным классом и интерфейсом в Java

Короткое различие:
Абстрактный класс — это класс, у которого не реализован один или больше методов.

Интерфейс — это абстрактный класс, у которого ни один метод не реализован, все они публичные и нет переменных класса.

Интерфейс нужен обычно когда описывается только логика взаимодействия между объектами. Например, один класс хочет дать другому возможность доступа к некоторым своим методам, но не хочет себя «раскрывать». Поэтому он просто реализует интерфейс.

Абстрактный класс нужен, когда нужно семейство классов, у которых есть много общего. Конечно, можно применить и интерфейс, но тогда нужно будет писать много идентичного кода.

Можно считать, что любой интерфейс — это уже абстрактный класс, но не наоборот.
How many methods are there in functional interface in Java 8?
Anonymous Quiz
9%
0
55%
1
19%
2
17%
3
#UI #hardware

Retina (в переводе с лат. — «сетчатка») — общее маркетинговое название ЖК и OLED дисплеев, используемых в устройствах Apple с 2010 года. Они отличаются повышенной плотностью пикселей, с тем, чтобы человеческий глаз не мог различить отдельные пиксели, из которых состоит изображение. И в то же время, название Retina запрещается использовать в продуктах других брендов для дисплеев, имеющих такую же или даже большую плотность пикселей.

Для технологии нет устоявшегося норматива по плотности пикселей: Apple определяет различную плотность для разных устройств и в соответствии с типичным расстоянием просмотра для данного класса устройств — чем больше типичное расстояние, тем меньшей плотности пикселей достаточно для их неразличимости.
#java
Интерфейс или абстрактный класс?

Выбор между интерфейсом и абстрактным классом зависит от многих факторов. Давайте рассмотрим основные аргументы в пользу интерфейсов и абстрактных классов.

1. Java не поддерживает множественное наследование, поэтому каждый класс может наследовать только один суперкласс. При этом любой класс может реализовать несколько интерфейсов. Именно поэтому интерфейсы являются лучшим выбором для вашего проекта. Также написание кода с использованием интерфейсов является одним из лучших практик программирования на Java.

2. Если вы решили написать много методов, то лучшим решением для вас будет абстрактный класс. Все дело в том, что мы можем обеспечить реализацию по умолчанию для некоторых методов, которые являются общими для всех подклассов.

3. Если мы захотим добавить или удалить метод из интерфейса, то с этим могут возникнуть проблемы. Все дело в том, что мы не можем объявить дополнительные методы в интерфейсе без изменения всех классов, которые реализуют этот интерфейс.
#java
Разница между Hashtable и HashMap в Java

⟡ HashMap реализует интерфейс Map, который подразумевает хранение данных в виде пар ключ-значение. HashMap не является синхронизированным и потокобезопасным. Также HashMap допускает хранение null ключей и значений, но недопускает дублей ключей. Следует помнить, что для null-ключа hashCode() всегда равен нулю.

⟡ Hashtable реализует интерфейс Map, которая хранит пары ключ-значения. Hashtable является синхронизированной и потокобезопасной коллекцией. Hashtable не допускается null-ключей и дублирующих ключей, а также null-значений.

(Обратите внимание. Под синхронизированностью (synchonized) имеется ввиду следующее: только один поток может изменить одну таблицу в одно и то же время. Когда какой-то поток работает c Hashtable, то она закрыта для других потоков, пока не отработает один)
#java
Лямбда-выражения в Java — что это такое, зачем нужны и как выглядят

Лямбда-выражения или анонимные функции — это блоки кода с параметрами, которые можно вызвать из другого места программы. Они называются анонимными, потому что в отличие от функций, у них нет имён.

Лямбда-выражения в Java
⟡ Присутствуют начиная с 8 версии.

⟡ Являются анонимными классами, реализующими метод функционального интерфейса.

⟡ Имеют доступ только к final (или effectively final) переменным из охватывающей области видимости (для потокобезопасности).

⟡ Не могут возвращать значение в каких-то ветках, а в других не возвращать.

⟡ Позволяют уменьшить количество кода и повысить его читаемость.

Лямбда-выражения в Java состоят из параметров и стрелки —> отделяющей тело функции. Скобки нужны, если параметров 0 или больше одного. Для однострочных лямбд ключевое слово return не обязательно.

(список параметров) -> тело лямбды
#hardware #backEnd
Как создатель node.js сам разочаровался в нем

Примерно
за полгода до конференции JSConf 2018 Райан Даль решил попробовать работать со своим детищем, спустя почти 10 лет с момента его создания. Нельзя сказать, что он был доволен тем, что увидел. Несомненно, проект сильно развился, но во время разработки Node.js Райан был слишком зациклен на решении проблем ввода/вывода, потому допустил некоторые ошибки, которые потом превратились в системные проблемы. Поскольку платформа стала чрезвычайно популярной, то уже поздно было что-то глобально менять, не поломав все зависимости и совместимость.

В 2011 году он устроил небольшую «пятиминутку ненависти» на Google+. Сама соцсеть давно закрыта, но интернет все помнит.

Давайте вспомним основные тезисы, которые были в нем рассмотрены:

Отсутствие Promises, от которых отказались на начальном этапе разработки.

Проблема с безопасностью. Приложение на Node.js получает доступ к локальному диску, сети и вообще ко всей системе сразу.
#java
Как работают потоки? (Stream API) (1/2)

Поток представляет собой последовательность элементов и поддерживает различные виды операций для выполнения вычислений:

List<String> mList = Arrays.asList("aa1","cc2", "cc1", "aa2", "bb1");

mList
.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
//Результат выполнения:
// AA1
// AA2

Операции над потоком относятся либо к промежуточным, либо к терминальным.

Все промежуточные операции возвращают поток, так что мы можем объединять несколько промежуточных операций без использования точки с запятой.

Терминальные операции возвращают void или непотоковый результат. В приведенном выше примере filter, map и sorted являются промежуточными операциями, тогда как forEach является терминальной операцией.
#java
Как работают потоки? (Stream API) (2/2)

Большинство операций потока принимают в качестве параметров какие-то лямбда-выражения, в функциональный интерфейс точное поведение по каждой операции. Большинство этих операций должны быть как неинтерферирующими (non-interfering), так и лишенными состояния (stateless). Что это значит?

Неинтерферирующуя функция не изменяет основной источник данных потока. Например, в приведенном выше примере лямбда выражение не изменяет mList путем добавления или удаления элементов из коллекции.

Лишенная состояния функция — выполнение операции является детерминированным, например, в приведенном выше примере лямбда-выражение не зависит от какой-либо изменяемой переменной или состояния из внешней среды, которая могла бы измениться во время выполнения.
​​#data_structures #general
Связные списки (Linked List)

Связный список — одна из базовых структур данных. Ее часто сравнивают с массивом, так как многие другие структуры можно реализовать с помощью либо массива, либо связного списка. У этих двух типов есть преимущества и недостатки.

Связный список состоит из группы узлов, которые вместе образуют последовательность. Каждый узел содержит две вещи: фактические данные, которые в нем хранятся (это могут быть данные любого типа) и указатель (или ссылку) на следующий узел в последовательности. Также существуют двусвязные списки: в них у каждого узла есть указатель и на следующий, и на предыдущий элемент в списке.

Основные операции в связном списке включают добавление, удаление и поиск элемента в списке.
​​#remoteControl #IDE #tools
Projector — это технология, с помощью которой вы запускаете IDE на базе IntelliJ либо Swing-приложения на сервере. Далее вы можете подключаться к ним откуда угодно, используя браузеры или нативные приложения. Очевидно всем очень полезно.

Есть множество ситуаций, требующих запуска IDE на сервере. Некоторые из них типичны для больших компаний, располагающих огромной инфраструктурой.

Projector — это клиент-серверное ПО. Вы запускаете IDE на сервере, а затем подключаетесь к ней по сети. Соединение между клиентом и сервером очень легковесное и высокоскоростное.
Что будет результатом выполнения программы?
Anonymous Quiz
17%
Compile error
8%
Hello
17%
ArithmeticException
58%
Hello2
​​#data_structures #general
Стеки (Stack)

Стек — это базовая структура данных, которая позволяет добавлять или удалять элементы только в её начале. Она похожа на стопку книг: если вы хотите взглянуть на книгу в середине стека, сперва придется убрать лежащие сверху.

Стек организован по принципу LIFO (Last In First Out, «последним пришёл — первым вышел») . Это значит, что последний элемент, который вы добавили в стек, первым выйдет из него.

В стеках можно выполнять три операции: добавление элемента (push), удаление элемента (pop) и отображение содержимого стека (pip).
​​#gamedev #math
Как математика используется в программировании?

Математикой в играх может называться просто сложение X и Y, манипулирование синусами, косинусами и т.д, однако в некоторых случаях над реализацией какого-либо правила в игре нужно подумать час-другой.

В качестве примера можно взглянуть на такие процессы, как создание векторов, названных MAXSPEED и MINSPEED, и добавление их в игровой цикл для проверки скоростей, расчёт скорости космического корабля, деформация поверхностей при соударении и изменение траектории и скорости в зависимости от силы удара.

Именно поэтому компании, занимающиеся разработкой игр, требуют от своих сотрудников знания математики и алгоритмов. Знание таких вещей не просто поможет разработать логику игры, но и качественно оптимизировать саму игру, находя альтернативные пути, которые помогают избежать лишних вычислений.

Некоторые вещи, которые полностью опираются на математику: симуляция жидкостей, анимация, алгоритмы, написание игровой логики, расчёт кадров в секунду, игровая физика, графика/Шейдеры, искусственный интеллект, процедурная генерация, рендеринг полигонов, и многие другие...
​​#data_structures #general
Очереди (Queues)

Эту структуру можно представить как очередь в продуктовом магазине. Первым обслуживают того, кто пришёл в самом начале — всё как в жизни.

Очередь устроена по принципу FIFO (First In First Out, «первый пришёл — первый вышел»). Это значит, что удалить элемент можно только после того, как были убраны все ранее добавленные элементы.

Очередь позволяет выполнять две основных операции: добавлять элементы в конец очереди (enqueue) и удалять первый элемент (dequeue).
#science #ASCII #easter

Решайтесь на великие поступки — ASCII

Момент
посадки на Марс ровера NASA Perseverance (Настойчивость) стал историческим событием. Человечество впервые увидело нечто подобное. Многие люди с замиранием сердца наблюдали за происходящим. «Настойчивость» многие годы будет служить для нас источником вдохновения.

Интернет-ищейки заявили о том, что им удалось расшифровать скрытое сообщение, нанесённое на купол парашюта, который помог роверу безопасно приземлиться на поверхность Красной планеты. Как оказалось, фраза «Dare Mighty Things» («Решайтесь на великие поступки») — девиз лаборатории реактивного движения NASA (Jet Propulsion Laboratory) — была закодирована на парашюте с использованием красных и белых полос, представляющих двоичный компьютерный код. Этот код, что неудивительно, можно, используя некоторые вычисления, перевести в кодировку ASCII и, в итоге, понять то, что в нём скрыто.