【问题标题】:Kotlin's scopes - exposing single entry pointKotlin 的作用域——暴露单一入口点
【发布时间】:2018-08-23 16:21:43
【问题描述】:

您好,我有一个关于 kotln 作用域的简单问题。我总是设计我的模块以获得模块的单一入口点。它只是一个(确切的一个)public 类。我真的很喜欢这种密封。所以想象一下这两个类(请注意包):

package group.moduleA.service
internal class HiddenService() {

    fun someFunction {

    }
}

  package group.moduleA.service
    class Service(private val hiddenService: HiddenService) {

        fun someFunction {

        }
    }

所以我们在同一个包中有两个类,一个是public,第二个是internal。你可以想象那里有很多internal 类。我想让其他模块只看到 Service 类。 Java中很常见的(对我来说)行为。在 kotlin 中出现错误:
“公共函数公开其内部参数...”
我做错了什么还是 Kotlin 范围的工作原理?我该如何解决这个问题?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    您必须声明构造函数internalprivate 并提供另一个 创建服务的函数/构造函数:

    class Service internal constructor(private val hiddenService: HiddenService) {
        constructor() : this(HiddenService())
    
        fun someFunction() {
    
        }
    }
    

    【讨论】:

    • 嗯,我可以为此目的使用 Spring 的 DI 吗?
    • 类服务内部构造函数(private val hiddenService: HiddenService) 我认为在这种情况下注入应该可以工作。我回家后检查一下,谢谢:)
    • 哦,太好了!非常感谢!
    【解决方案2】:

    Dependency inversion principle 是一个很好的起点:

    internal class HiddenServiceImpl : HiddenService {
        override fun someFunction() {    
        }
    }
    
    interface HiddenService {
        fun someFunction()
    }
    
    
    class Service(private val hiddenService: HiddenService) {
        fun someFunction() {  
        }
    }
    

    其他选项是使用工厂方法:

    class Service private constructor(hiddenService: HiddenService) {
    
        companion object {
            fun create() = Service(HiddenService())
        }
    
        fun someFunction() {
    
        }
    }
    

    【讨论】:

    • HiddenService 接口在模块外仍然可见,对吧?
    • 如果您希望有人为您提供服务,您必须将其公开,因为有人会在您的模块之外。 Spring DI 基于接口。否则,使用工厂方法模式。
    • 我想将 Spring 的 DI 内部类注入公共类。要求是由构造函数注入
    猜你喜欢
    • 2021-03-16
    • 2019-12-08
    • 2019-12-14
    • 2018-06-19
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多