Kotlin 中的私有构造函数

2022-08-31 11:01:59

在Java中,可以通过创建类,然后通过该类中的方法访问它来隐藏类的主构造函数:privatepublicstatic

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;
    }

    // ...
}

如何在不将类分离到接口和实现中的情况下,使用 Kotlin 实现相同的目标?创建构造函数会导致无法从类外部访问它,甚至无法从同一文件访问它。publicprivateprivate


答案 1

您甚至可以执行更类似于“模拟”公共构造函数用法,同时具有私有构造函数。

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

答案 2

使用伴随对象可以做到这一点:

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

            return Foo(someData)
        }
    }

    // ...
}

伴随对象内的方法可以像它们是周围类的成员一样访问(例如Foo.constructorA())