Как правильно изменить доступ в частях моей библиотеки kotlin android, чтобы пользователь не мог взаимодействовать с ними? - PullRequest
0 голосов
/ 30 апреля 2020

Итак, я пытался написать свою первую Kotlin Android библиотеку. Это обертка, которая (в теории) должна немного облегчить использование Network System Discovery. К go по поводу того, что происходит и что я пытаюсь сделать. Я абстрагирую большую часть кода и опущу его. Таким образом, встроенный NSD для androids требует много стандартного кода и слушателей, которые должны быть реализованы перед его использованием. Я попытался решить эту проблему, используя современные подходы и возможности Kotlins. Итак, теперь у меня есть класс NsdHelper, который вы создаете один раз и используете для регистрации, отмены регистрации, обнаружения служб и так далее. Это достигается благодаря наличию обертки вокруг списков, которые вызывают методы c в классе помощника.

Пример метода помощника

        sName: String,
        sType: String,
        sPort: Int,
        success: (NsdServiceInfo?) -> Unit,
        failure: (Exception?) -> Unit
    ) {
        val serviceInfo = NsdServiceInfo().apply {
            serviceName = sName
            serviceType = sType
            port = sPort
        }
        registerSuccessCallBack = success

        registerFailureCallBack = failure

        mNsdManager.registerService(
            serviceInfo,
            NsdManager.PROTOCOL_DNS_SD,
            registrationListener
        )
    }

Для регистрации службы вы передаете все необходимая информация вместе с лямбдами, которые будут выполнены в случае неудачи или успеха. Проблема возникает здесь, потому что я должен хранить обратные вызовы registerSuccessCallBack и registerFailureCallBack в классе. Итак, это выглядит так

class NsdKRegistrationListener(val nsdKelper: NsdKelper) : NsdManager.RegistrationListener{

    companion object {
        private const val ERROR_SOURCE = "android.net.nsd.NsdHelper.RegistrationListener"
    }

    override fun onUnregistrationFailed(serviceInfo: NsdServiceInfo?, errorCode: Int) {
        Log.d("TAG", "UnRegistration failed $errorCode")
        nsdKelper.unRegisterFailureCallBack?.invoke(UnRegistrationFailedException(errorCode.toString()))
    }

    override fun onServiceUnregistered(serviceInfo: NsdServiceInfo?) {
        Log.d("TAG", "Unregistered service $serviceInfo")
        nsdKelper.unRegisterSuccessCallBack?.invoke(serviceInfo)
    }

Таким образом, они должны быть опубликованы c для доступа слушателей. Я подумал о 2 решениях, но не смог найти в Интернете никакой информации о том, как правильно подойти к этому. Во-первых, сделать слушатели внутренними классами, но это резко увеличит размер класса Helper, и это просто неправильно. Другое решение состояло в том, чтобы создать слушателей в вызове функции и передать обратные вызовы в их конструктор. Если у кого-то есть идея, я бы очень признателен за несколько советов или советов о том, как написать это правильно и почему так. Это была одна из самых сложных вещей, на которые я рассчитывал.

1 Ответ

0 голосов
/ 05 мая 2020

Используйте internal вместо private, чтобы они были доступны только в модуле.

...