У меня есть класс object
в Котлине, который является менеджером - назовем его KManager
- этот менеджер находится внутри независимого модуля ( moduleA ).Есть еще один модуль ( moduleB ), где я использую KManager
.
Правило: moduleB знает о moduleA , но moduleA не должен ничего знать о moduleB .
Я создал как мост (интерфейс) для связи moduleA с moduleB , потому что есть некоторая общая логика, которая должна выполняться в обе стороны.Интерфейс объявлен в KManager
как:
//moduleA
object KManager {
var bridgeShared: BridgeShared? = null
....
}
Интерфейс:
interface BridgeShared {
fun foo()
}
Теперь у меня есть класс в moduleB , где реализуется BridgeShared
.Когда приложение запускается, я инициализирую bridgeShared
следующим образом:
//moduleB
class BridgeSharedImpl : BridgeShared {
KManager.bridgeShared = this
....
}
Я получаю KManager.bridgeShared
в moduleB и выполняю функции интерфейса в других классах, что-то вроде:
KManager.bridgeShared.foo()
Вопрос здесь в том, вредно ли объявить слушателя внутри класса object
Kotlin и захватывать его всякий раз, когда мне это нужно?
ПРИМЕЧАНИЕ: Здесь не используются реальные имена, только для описания сценария.
ОБНОВЛЕНИЕ:
Дополнительные шаги:
moduleA получает как внешнее событие, обрабатывается и затем результат получает «Наблюдатель», подписавшийся на прослушиватель BridgeShared
, этот «Наблюдатель» является moduleB , но moduleA не заботится об этом (правило).
moduleB
class BridgeSharedImpl : BridgeShared {
KManager.bridgeShared = this
override fun eventProcessed() {
//stuff
}
override fun fetchData() {
//stuff
}
fun callAnotherFunction1() {
KManager.anotherFunction1()
}
}
moduleA
interface BridgeShared {
fun eventProcessed()
fun fetchedData()
}
object KManager {
var bridgeShared: BridgeShared? = null
fun anotherFunction1() {
//not-related to BridgeShared, called from outside
}
fun anotherFunction2() {
//not-related to BridgeShared, called from outside
}
}
class EventProcessor {
fun eventReceived() {
//stuff
KManager.bridgeShared?.eventProcessed()
}
}
class DataFetcher {
fun dataReceived() {
//stuff
KManager.bridgeShared?.fetchedData()
}
}
С другой стороны, я использую KManager.bridgeShared
в moduleB для вызова тех же функций внутри того же moduleB , потому чтоУ меня нет доступа к экземпляру BridgeSharedImpl
везде, где бы он ни был создан.
Теперь moduleB использует синглтон KManager
для выполнения других функций, не связанных сThe BridgeShared.