Является ли хорошей идеей поместить код экземпляра класса в интерфейс в Kotlin? - PullRequest
0 голосов
/ 09 апреля 2020

Код A взят из проекта android / архитектура-компоненты-образцы .

Автор помещает код экземпляра класса DefaultServiceLocator в interface ServiceLocator.

На мой взгляд, обычно интерфейс не должен включать какой-либо реализуемый код.

Это хорошая идея, чтобы поместить код экземпляра класса в интерфейс в Kotlin?

Код A

interface ServiceLocator {
    companion object {
        private val LOCK = Any()
        private var instance: ServiceLocator? = null


        fun instance(context: Context): ServiceLocator {
            synchronized(LOCK) {
                if (instance == null) {
                    instance = DefaultServiceLocator(
                            app = context.applicationContext as Application,
                            useInMemoryDb = false)
                }
                return instance!!
            }
        }

        /**
         * Allows tests to replace the default implementations.
         */
        @VisibleForTesting
        fun swap(locator: ServiceLocator) {
            instance = locator
        }
    }

    ...
}


open class DefaultServiceLocator(val app: Application, val useInMemoryDb: Boolean) : ServiceLocator {
  ...
}

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Согласно kotlin документации по интерфейсам:

Интерфейсы в Kotlin могут содержать объявления абстрактных методов, а также реализации методов. Что отличает их от абстрактных классов, так это то, что интерфейсы не могут хранить состояние. Они могут иметь свойства, но они должны быть абстрактными или предоставлять реализации средства доступа.

Итак ... нет проблем в использовании реализаций методов на интерфейсах. Эта функция может предложить вам дополнительную мощность (если вам нравится и нужно ее использовать).

1 голос
/ 09 апреля 2020

На мой взгляд, обычно интерфейс не должен включать какой-либо реализуемый код.

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

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