【问题标题】:Private constructor in KotlinKotlin 中的私有构造函数
【发布时间】:2018-04-01 13:04:11
【问题描述】:

在 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 会导致无法从类外部访问它,甚至不能从同一个文件访问。

【问题讨论】:

    标签: java constructor kotlin visibility


    【解决方案1】:
    This is the Answer
    
    class Hide private constructor(val someData: Data) {
    
    }
    
    By declaring the constructor private, we can hiding constructor.
    

    【讨论】:

    • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。
    • 你的回复没有回答问题,两年前多次给出正确答案?
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      您甚至可以在拥有私有构造函数的同时做一些更类似于“模拟”公共构造函数的使用。

      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
      

      【讨论】:

        【解决方案4】:

        这可以使用伴随对象:

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

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

        【讨论】:

        • 添加到这个是为了完整性。在 Java 中,您只能使用 Companion 调用伴随对象内的方法,例如 Foo.Companion.constructorA()。为了使其在 Java 中更自然,请使用 @JvmStatic 注释该方法,该方法将像静态方法一样运行(称为 Foo.constructorA())。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 2022-11-26
        • 2019-10-16
        相关资源
        最近更新 更多