在Java中,可以隐藏类的主构造函数,方法是将其设为private,然后通过该类中的public static方法访问它:

public final class Foo {
    /* Public static method */
    public static final Foo constructorA() {
        // do stuff

        return new Foo(someData);
    }

    private final Data someData;

    /* Main constructor */
    private Foo(final Data someData) {
        Objects.requireNonNull(someData);

        this.someData = someData;
    }

    // ...
}

在不将类拆分为public接口和private实现的情况下,如何使用Kotlin实现同样的功能?构造构造函数private会导致无法从类外访问它,甚至不能从同一个文件访问它.

推荐答案

您甚至可以做一些更类似于"模拟"公共构造函数的使用,同时使用私有构造函数.

class Foo private constructor(val someData: Data) {
    companion object {
        operator fun invoke(): Foo {
            // do stuff

            return Foo(someData)
        }
    }
}

//usage
Foo() //even though it looks like constructor, it is a function call

Kotlin相关问答推荐

如何在Jetpack Compose中的列中渲染图像

Kotlin中的增广赋值语句中的难以理解的错误

"Kotlin中的表达式

在调用父构造函数之前重写类属性

Spring Boot 3:为Kotlin中的TestRestTemplate配置读取超时

在kotlin中匹配多个变量

使用事务时未调用 Kafka ConsumerInterceptor onCommit

匹配在单词边界上包含特殊字符的变量字符串的正则表达式

如何通过 compose 处理剪切区域?

TestContainers PostgreSQLContainer 与 Kotlin 单元测试:Not enough information to infer type variable SELF

Kotlin 中的部分类委托

Kotlin 创建snackbar

requireNotNull vs sure !! 操作符

如何使用Kotlin Dokka记录主构造函数参数

Kotlin - 具有私有构造函数的类的工厂函数

Kotlin数据类打包

我应该使用Kotlin数据类作为JPA实体吗?

如何在kotlin用mockito模仿lambda

你如何在 Kotlin 中注释 Pair 参数?

我应该在哪里调用 MobileAds.initialize()?