#java
Разница между equals() и compareTo()
♨️ При реализации интерфейсного метода Comparable compareTo, мы решаем как именно наши объекты будут сравниваться с друг с другом.
♨️В свою очередь, equals просто говорит нам, равны ли 2 объекта.
Разница между equals() и compareTo()
⟡
Метод equals() проверяет объекты на равенство, то есть возвращает просто логическое значение - true/false.⟡
compareTo() сравнивает объекты, и возвращает 0 если объекты равны, 1(или другое положительное число) если объект больше другого объекта, -1(или другое отрицательное число) - объект меньше другого объекта.♨️ При реализации интерфейсного метода Comparable compareTo, мы решаем как именно наши объекты будут сравниваться с друг с другом.
♨️В свою очередь, equals просто говорит нам, равны ли 2 объекта.
#python
6 хитростей Python, о которых никто не рассказывает новичкам
1. Выбор случайного элемента из последовательности элементов
2. Распаковка элементов с помощью *
3. Использование set для оптимизации различных операций
4. Просмотр атрибутов и методов класса в интерпретаторе Python
5. Операции со срезами
6. Вызов отладчика 10-символьной командой
Функцией breakpoint() можно пользоваться в Python 3.6+. Она инициирует запуск сессии pdb.set_trace().
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)
#science #openSource
Если хотите стать частью истории, то вот ссылка на репозиторий вертолета от NASA
https://github.com/nasa/fprime
https://github.blog/2021-04-19-open-source-goes-to-mars/
Если хотите стать частью истории, то вот ссылка на репозиторий вертолета от NASA
https://github.com/nasa/fprime
https://github.blog/2021-04-19-open-source-goes-to-mars/
GitHub
GitHub - nasa/fprime: F´ - A flight software and embedded systems framework
F´ - A flight software and embedded systems framework - nasa/fprime
#java
Что такое атомарность в Java?
Как можно определить атомарность?
Атомарность операции чаще всего принято обозначать через ее признак неделимости: операция может либо примениться полностью, либо не примениться вообще. Хорошим примером будет запись значений в массив:
При использовании метода nonAtomic существует вероятность того, что какой-то поток обратится к array[0] в тот момент, когда array[0] не проинициализирован, и получит неожиданное значение. При использовании probablyAtomic (при том условии, что массив сначала заполняется, а уже потом присваивается. Такого быть не должно: array всегда содержит либо null, либо проинициализированный массив, но в array[0] не может содержаться что-то, кроме 1. Эта операция неделима, и она не может примениться наполовину, как это было с nonAtomic - только либо полностью, либо никак, и весь остальной код может спокойно ожидать, что в array будет либо null, либо значения, не прибегая к дополнительным проверкам.
Кроме того, под атомарностью операции зачастую подразумевают видимость ее результата всем участникам системы, к которой это относится (в данном случае - потокам); это логично, но, на мой взгляд, не является обязательным признаком атомарности.
Почему это важно?
Атомарность зачастую проистекает из бизнес-требований приложений: банковские транзакции должны применяться целиком, билеты на концерты заказываться сразу в том количестве, в котором были указаны, и т.д.
Что такое атомарность в 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 делать это автоматически, как описано выше. Он отделяет объявление Боба от определения класса.
Spring: @Component против @Bean
@Component и @Bean делают две совершенно разные вещи, и их не следует путать.
@Component (а также @Service и @Repository ) используются для автоматического обнаружения и автоматической настройки бобов с помощью сканирования classpath. Существует неявное отображение one-to-one между аннотированным классом и Бобом (то есть один боб на класс). Управление проводкой при таком подходе довольно ограничено, поскольку оно носит чисто декларативный характер.
@Bean используется для явного объявления одного компонента, а не позволяет Spring делать это автоматически, как описано выше. Он отделяет объявление Боба от определения класса.
Что будет результатом выполнения программы?
Anonymous Quiz
57%
Код скомпилируется успешно
43%
Exception (java: incompatible types)
Что будет выведено в консоль?
Anonymous Quiz
7%
Good morning
8%
HelloI@1b28cdfa
15%
@1b28cdfa@1b28cdfa
20%
HelloHello
24%
HelloGood morning
26%
Hello
Что будет выведено в консоль?
Anonymous Quiz
17%
Программа выкинет Exception
55%
x5
19%
Hello, World!x5
3%
omg
6%
omgHelloWorld!5x5
Что будет выведено в консоль?
Anonymous Quiz
6%
Johnson
55%
John Johnson
3%
Exception
27%
John
9%
@ISB426
О чем бы вы хотели пост?
Anonymous Poll
58%
Немножко о наследовании, точнее о некоторых нюансах, которые часто упускают из виду
34%
Конракт equals и hashcode
8%
Исключения
#java
Немного о наследовании и ООП
Какие методы можно переопределять?
- Все методы, которые не являются static, final или private.
this - ссылка на текущий объект
super - не то же что и this. Это ключевое слово всего лишь уведомляет компилятору, что нужно вызвать из суперкласса.
Невозможно использование super в static методах и переменных.
Для того чтобы обратиться к элементам родительского класса с помощью super, эти элементы должны быть видны в дочернем классе.
При обращении к методу родительского класса, выражение super не обязательно должно быть первой строкой тела метода.
Ключевое слово new - вызывается конструктор, который инициализирует поля.
Конструктор не является членом класса, то есть он не наследуется, по этой причине, мы и используем ключевое слово super для его вызова из суперкласса.
К любому члену класса мы можем обратиться через "точку", к полям, к методом. К конструктору мы обратиться не сможем.
Немного о наследовании и ООП
Какие методы можно переопределять?
- Все методы, которые не являются static, final или private.
this - ссылка на текущий объект
super - не то же что и this. Это ключевое слово всего лишь уведомляет компилятору, что нужно вызвать из суперкласса.
⟡
keyword super означает обращение к объекту родительского класса.
С помощью keyword super можно обращаться как к методам, так и к переменным родительского класса.Невозможно использование super в static методах и переменных.
Для того чтобы обратиться к элементам родительского класса с помощью super, эти элементы должны быть видны в дочернем классе.
При обращении к методу родительского класса, выражение super не обязательно должно быть первой строкой тела метода.
❗️⟡
Конструктор - инициализатор, некий набор инструкций, который для вновь созданного объекта задает некоторое начальное состояние. Ключевое слово new - вызывается конструктор, который инициализирует поля.
Конструктор не является членом класса, то есть он не наследуется, по этой причине, мы и используем ключевое слово super для его вызова из суперкласса.
К любому члену класса мы можем обратиться через "точку", к полям, к методом. К конструктору мы обратиться не сможем.
Возможно будет продолжение в сторону Reflection API. Кому интересно, накидайте лайков.
Что будет выведено в консоль?
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, если объект, который мы делаем каст на самом деле не принадлежит классу, на который мы его делаем каст.