Слушатель объявлен в классе объектов Kotlin - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть класс 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.

1 Ответ

0 голосов
/ 24 ноября 2018

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

moduleA

class BridgeFactory(private val bridgeShared: BridgeShared) {

    companion object {

        lateinit var bridgeFactory: BridgeFactory

        fun initialize(bridgeShared: BridgeShared) {
            bridgeFactory = BridgeFactory(emmaShared)
        }
    }

    fun eventProcessor(): EventProcessor {
        return EventProcessor(bridgeShared)
    }

    fun dataFetcher(): DataFetcher {
        return DataFetcher(bridgeShared)
    }

}

class EventProcessor(private val bridgeShared: BridgeShared) {

  fun eventReceived() {
    //stuff
    bridgeShared.eventProcessed()
  }  

}

class DataFetcher(private val bridgeShared: BridgeShared) {

  fun dataReceived() {
    //stuff
    bridgeShared.fetchedData()
  }  

}

moduleB

class BridgeSharedImpl : BridgeShared {

    init {
        BridgeFactory.initialize(this)
    }

   override fun eventProcessed() {
      //stuff
   }

   override fun fetchData() {
     //stuff
   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...