Все объекты гарантированно имеют метод .equals()
, поскольку Object содержит метод, .equals()
, который возвращает логическое значение. Задача подкласса переопределять этот метод, если требуется дополнительное определение определения. Без него (т. Е. Используя ==
) только адреса памяти проверяются между двумя объектами для равенства. String переопределяет этот метод .equals()
и вместо использования адреса памяти возвращает сравнение строк на уровне символа для равенства.
Ключевое замечание состоит в том, что строки хранятся в одном пуле, поэтому после создания строки он всегда хранится в программе по тому же адресу. Строки не меняются, они неизменяемы. Вот почему это плохая идея использовать регулярную конкатенацию строк, если у вас есть серьезное количество обработки строк. Вместо этого вы будете использовать предоставленные классы StringBuilder
. Помните, что указатели на эту строку могут измениться, и если вам было интересно увидеть, были ли два указателя одинаковыми ==
, это был бы прекрасный способ. Строки сами не делают.
Bus-Message (ориентированный на события) способ может соответствовать вашей проблеме. F.E. у нас есть класс SomeEventHappenedMessage с некоторыми данными внутри. Когда происходит какое-либо событие, сообщение отправляется через шину, и слушатели получают его.
Вы можете написать свою собственную шину или использовать библиотеку EventBus https://github.com/greenrobot/EventBus для отправки и получения сообщений / событий.
Псевдокод:
//listener registers/unregisters when needed
Bus.register()
Bus.unregister()
//listener listens for message
onMessage(SomeEventHappenedMessage msg) {
if msg.hasSomeData {
music.play()
} else {
music.stop()
}
}
//message being sent
SomeEventHappenedMessage message = (message creation)
Bus.sendMessage(message)
Для такого рода логики обратного вызова, которая требует перекрестного взаимодействия с различными задачами и потоками, я обычно использую Reactive Extensions для Android (RxAndroid), в частности Observables.
https://github.com/ReactiveX/RxAndroid
Вы можете создавать и просматривать Observables в разных потоках, в основном подписываясь на просмотр переменной, затем, когда значение меняет ваше приложение логика может реагировать на изменения.
Подробнее о многопоточности и RxJava читайте здесь:
https://blog.gojekengineering.com/multi-threading-like-a-boss-in-android-with-rxjava- 2-b8b7cf6eb5e2
В зависимости от архитектуры вашего приложения хорошим способом для этого является наличие центрального диспетчера данных приложения, к которому могут обращаться другие компоненты. Установив Observables в Диспетчере данных приложения, другие компоненты приложения могут затем подписаться, чтобы наблюдать за интересующими их переменными и реагировать на изменения.
Обычно я основываю свои приложения для Android на базе Java на удивительной архитектуре MVP для Android от Mindorks, в которой широко используются RxJava и Observables.
https://github.com/MindorksOpenSource/android-mvp-architecture