Source Code
197 subscribers
30 photos
3 files
80 links
Download Telegram
#java
Разница между equals() и compareTo()

Метод equals() проверяет объекты на равенство, то есть возвращает просто логическое значение - true/false.

compareTo() сравнивает объекты, и возвращает 0 если объекты равны, 1(или другое положительное число) если объект больше другого объекта, -1(или другое отрицательное число) - объект меньше другого объекта.

♨️ При реализации интерфейсного метода Comparable compareTo, мы решаем как именно наши объекты будут сравниваться с друг с другом.
♨️В свою очередь, equals просто говорит нам, равны ли 2 объекта.
#python

6 хитростей Python, о которых никто не рассказывает новичкам

1. Выбор случайного элемента из последовательности элементов

import random as r
my_list = [1, 2, 3, "go"]
print(r.choice(my_list))


2. Распаковка элементов с помощью *

my_list = [1, 2, 3, 5, 7]

print(*my_list) # 1 2 3 5 7


3. Использование set для оптимизации различных операций

def eliminate_duplicates(lst):
"""
Возвращает отсортированный список, не содержащий дубликатов
"""
new_list = list(set(lst))

new_list.sort()

return new_list

list1 = [25, 12, 11, 4, 12, 12, 25]

print(eliminate_duplicates(list1))


4. Просмотр атрибутов и методов класса в интерпретаторе Python

string = "A string"

print(dir(string))


5. Операции со срезами

lst = ["Fun", "is", "Programming"]

lst = lst[::-1]

print(lst) # ['Programming', 'is', 'Fun']

# Инвертирование строки

string = "Dog running on the park"

string = string[::-1]

print(string) # krap eht no gninnur goD


6. Вызов отладчика 10-символьной командой

Функцией breakpoint() можно пользоваться в Python 3.6+. Она инициирует запуск сессии pdb.set_trace().


n_odds = 0

for i in range(1, 14, 2):
# Проверка значения i в каждой итерации
breakpoint()
# Если это условие выполняется - значит, нас что-то не устраивает
if i % 2 == 0:
n_odds += 1

print(n_odds)
#java

Что такое атомарность в Java?

Как можно определить атомарность?

Атомарность операции чаще всего принято обозначать через ее признак неделимости: операция может либо примениться полностью, либо не примениться вообще. Хорошим примером будет запись значений в массив:

При использовании метода nonAtomic существует вероятность того, что какой-то поток обратится к array[0] в тот момент, когда array[0] не проинициализирован, и получит неожиданное значение. При использовании probablyAtomic (при том условии, что массив сначала заполняется, а уже потом присваивается. Такого быть не должно: array всегда содержит либо null, либо проинициализированный массив, но в array[0] не может содержаться что-то, кроме 1. Эта операция неделима, и она не может примениться наполовину, как это было с nonAtomic - только либо полностью, либо никак, и весь остальной код может спокойно ожидать, что в array будет либо null, либо значения, не прибегая к дополнительным проверкам.

Кроме того, под атомарностью операции зачастую подразумевают видимость ее результата всем участникам системы, к которой это относится (в данном случае - потокам); это логично, но, на мой взгляд, не является обязательным признаком атомарности.

Почему это важно?

Атомарность зачастую проистекает из бизнес-требований приложений: банковские транзакции должны применяться целиком, билеты на концерты заказываться сразу в том количестве, в котором были указаны, и т.д.
#Spring #backEnd #java
Spring: @Component против @Bean

@Component и @Bean делают две совершенно разные вещи, и их не следует путать.

@Component (а также @Service и @Repository ) используются для автоматического обнаружения и автоматической настройки бобов с помощью сканирования classpath. Существует неявное отображение one-to-one между аннотированным классом и Бобом (то есть один боб на класс). Управление проводкой при таком подходе довольно ограничено, поскольку оно носит чисто декларативный характер.

@Bean используется для явного объявления одного компонента, а не позволяет Spring делать это автоматически, как описано выше. Он отделяет объявление Боба от определения класса.
Что будет результатом выполнения программы?
Anonymous Quiz
57%
Код скомпилируется успешно
43%
Exception (java: incompatible types)
Что будет выведено в консоль?
Anonymous Quiz
6%
Johnson
55%
John Johnson
3%
Exception
27%
John
9%
@ISB426
#java
Немного о наследовании и ООП

Какие методы можно переопределять?
- Все методы, которые не являются static, final или private.

this - ссылка на текущий объект
super - не то же что и this. Это ключевое слово всего лишь уведомляет компилятору, что нужно вызвать из суперкласса.
keyword super означает обращение к объекту родительского класса.

С помощью keyword super можно обращаться как к методам, так и к переменным родительского класса.

Невозможно использование super в static методах и переменных.

Для того чтобы обратиться к элементам родительского класса с помощью super, эти элементы должны быть видны в дочернем классе.

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

❗️ Конструктор - инициализатор, некий набор инструкций, который для вновь созданного объекта задает некоторое начальное состояние.
Ключевое слово new - вызывается конструктор, который инициализирует поля.
Конструктор не является членом класса, то есть он не наследуется, по этой причине, мы и используем ключевое слово super для его вызова из суперкласса.
К любому члену класса мы можем обратиться через "точку", к полям, к методом. К конструктору мы обратиться не сможем.

Возможно будет продолжение в сторону Reflection API. Кому интересно, накидайте лайков.
#patterns
Паттерн Стратегия

Начнем с проблемы, которую решает данный паттерн. Сразу же приведем пример.
У нас есть класс Navigator (#1), в котором мы в зависимости от типа передвижения прокладывает маршрут от точки A в точку B.
Все, в принципе, работает. Но проблемы начинаются при расширении типов передвижения. Если пользователь теперь хочет чтобы ему прокладывался маршрут когда он на машине, мы должны лезть в наш исходный класс, и вручную это все прописывать. Также, мы нарушаем один из принципов SOLID, что класс должен быть закрыт для изменения, но открыт для расширения.

Решение. Вместо кучи if 'ов, мы создадим интерфейс (#2), который сможет принимать любые типы передвижения.
Теперь, наш класс мы не трогаем. Мы создали интерфейс с методом который строит маршрут. И создали пару классов, которые реализуют этот метод по своему. В общем, теперь мы можем создать хоть тысячу классов с типами передвижения, благодаря которым сможет строить маршрут так, как это надо, не изменяя базовый класс, а только расширяя его "возможности".

(Код не является идеальным примером реализации этого паттерна, он просто кое-как отображает его суть)
#java
Кастинг ссылочных типов данных

Кастинг - это процесс, когда вы заставляете переменную одного типа данных вести себя как переменная другого типа данных.
Кастинг возможен только тогда, когда между классами/интерфейсами существует IS-A взаимоотношение.
Делая кастинг, вы не меняете тип данных объекта, а заставляете его чувствовать себя как объект другого типа.

Кастинг из дочернего класса в супер класс происходит автоматически - Upcasting.
Кастинг из супер класса в дочерний класс НЕ происходит автоматически - Downcasting.

Если между классами/интерфейсами нет IS-A взаимоотношения, компилятор не допустит кастинг.

Даже если компилятор допустил кастинг, выскочит runtime exception, если объект, который мы делаем каст на самом деле не принадлежит классу, на который мы его делаем каст.